javascript var的理解

 认识var必须了解


1.   var的作用是声明当前作用域下的变量。
2.   V8引擎在解释JS代码时做了两个动作,

  一是从头到尾抽出所有变量和函数并赋初值 ; 

  二是再来一遍给变量运算赋值(引用);

3.   在做第一遍动作时,所有标识符指向undefined ,函数指向函数本身。

4.   参数是一种运算

5.   局部作用域内没有时找时到向外找,直到找到为止,否则undefined。

 

 

var a = 1;
function fn1() {
    console.log(a);
    var a = 2;
}

fn1();          // undefined
console.log(a);  //1

 

解释器的第一次操作

找到变量a,赋值为undefined

函数fn1 初值就是本身也就是 fn1={console.log(a);var a =2};

 

解释器的第二次操作

变量a赋初值,a指向1

 

当发生函数调用时,fn1是一个新的作用域,重复以上的解释步骤

找到变量a,赋值为undefined

所以在执行函数fn1()的console.log(a)时 a的值为undefined

而fn1()下面的console.log(a)里面的a是全局变量

 

下面例子也证明了解释器的工作步骤

var a = 1;
function fn1() {
    console.log(a);
    a = 2;

}

fn1();   // 1
console.log(a);  // 2

 fn1函数里面在解释时,没有a这个变量,于是向上查找 找到全局变量 var a =1 

于是fn1里面a就变成了全局变量,进行运算,于是最后函数外的console.log()打印出来的结果就是2

 

1 var a = 1;
2 function fn1(a) {
3     console.log(a);
4     a = 2;
5 
6 }
7 
8 fn1(a);  //结果为1
9 console.log(a);//结果为1

同样,第一次操作动作 抽取 了 a  和 fn1 , 第二次操作动作赋值,当遇到函数调用时,继续执行前两个动作

找到了 参数 a并赋上初值undefined fn1 传入参数a 这里的a是全局变量var a = 1,参数也是一种运算,相当于是给参数a赋值了1

于是函数内部的console.log(a)打印出1 

第4行的a指向参数,是函数范围内的变量,进行 a =2的计算后,函数内的局部变量a的值为2

第9行的console.log(a) 中的a 为全局变量,打印出来的结果为1。

 

posted @ 2017-01-19 15:13  panw3i  阅读(337)  评论(0编辑  收藏  举报