js变量详解

来源:互联网 发布:sybase数据库12.5 编辑:程序博客网 时间:2024/06/12 21:28


一、变量声明

1、遵循原则:先声明,后使用

2、预解析机制(变量提升):对紧跟在关键字(如var,function)后面的变量名称进行声明提前(把声明部分提前,赋值部分保留在原位置)。遇到关键字就有声明提前。

 

 

二、变量作用域

1、全局作用域---全局变量:(ES5中)三种声明方式

                                                 A.var 变量

                                                 B.变量

                                                 C.windw.变量(原理:对象.属性)

区别:加var的变量,不能被delete删除,不加var的变量会被delete删除。

Window是作用域链的最顶层

2、函数作用域---局部变量:只有变量在函数内声明时,它才是局部变量

       特例:不加var的变量在函数内声明,则是全局变量

               加了var的变量在函数内声明,才是局部变量

3.作用域链的最顶层是window

4.变量的定义没有块级作用域(如:if,while等块中,即非函数的块),故里面声明的变量还是全局变量

 

 

三、未定义的变量和为赋值的变量

1、变量未定义,且未赋值---------报错

2、变量定义,但是未赋值---------undefinde

3、变量未定义,但是有赋值---------正常显示,程序会在全局中隐式声明该变量

 

 

 

 

关于变量的练习:

1题、

if(!(ainwindow)){

      var a=1;

      //a=1;//vara被提前后

}

console.log(a)

 

解析:

1、    变量提升

2、    console.log(变量x in window);变量x必须是干干净净的,不能有赋值,最后输出true;否则输出false

 

程序解析为:

var a;//因为a没有被赋值,所以a in windowtrue

if(!(ainwindow)){//false

      var a=1;

}

console.log(a)//undefinde

 

 

2题、

var x=1;

y=2;

function fn1(){

      deletex;

      deletey;//delete只会删除未加var的变量,不会删除加了var的变量和参数

      console.log(x);//1

      console.log(y);//报错

}

fn1();

解析:delete只会删除未加var的变量,不会删除加了var的变量和参数;

因为y没有直接定义,所以他是全局作用域的一个属性,是可配置的,所以可以删除;x是有var声明的,所以他是不可配置的,所以不可删除;

 

 

3题

(function(x){

      deletex;//delete对局部变量名不起作用

      console.log(x);//5

})(1+4);

解析:delete对局部变量名不起作用

 

 

4题、

var a=1;

function fn(){

      console.log(a);//1

      a=2;//没有加 var,就是全局变量,加var后,则是局部变量

      console.log(a);//2

}

fn();

console.log(a);//2