"
认识var必须了解
1. var的作用是声明当前作用域下的变量。
2. V8引擎在解释JS代码时做了两个动作,
一是从头到尾抽出所有变量和函数并赋初值 ;
二是再来一遍给变量运算赋值(引用);
3. 在做第一遍动作时,所有标识符指向undefined ,函数指向函数本身。
4. 参数是一种运算。
5. 局部作用域内没有时找时到向外找,直到找到为止,否则undefined。
var a = 1;
function //代码效果参考:https://v.youku.com/v_show/id_XNjQwMDM2ODcwNA==.html
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 //代码效果参考:https://v.youku.com/v_show/id_XNjQwNjgyMjI4MA==.html
= 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。
"