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。