1. 外层变量内层可以找到,内层变量外层找不到
1 2 3 4 5 6 7 8 9
| var a = 10; function aaa(){ alert(a); } function bbb(){ var a = 20; aaa(); } bbb();
|
函数bbb执行到aaa时会返回第二行进行调用,所以弹出的全局变量
2.var a = 10; 与 a=10; 的区别
1 2 3 4 5
| function aaa(){ a = 10; } aaa(); console.log(a);
|
1 2 3 4 5
| function aaa(){ var a = 10; } aaa(); console.log(a);
|
1 2 3 4 5 6 7
| ```javascript function aaa(){ var a=b= 10; } aaa(); console.log(b); // 10 console.log(a); // not defined
|
3. 变量的查找是就近原则去找var定义的变量,当就近没有的话就会去查找外层。
1 2 3 4 5
| var a=10; function aaa(){ var a = 20; console.log(a); }
|
1 2 3 4 5 6
| ```javascript var a=10; function aaa(){ a = 20; console.log(a); // 20, 全局部变量a }
|
当要输出a的时候,首先在aaa函数中找a的定义,没找到(第三行并没有定义a)就到外层找a的定义,找到了全局局部变量a。当全局变量a进入aaa函数时被赋值为20。
1 2 3 4 5
| var a=10; function aaa(){ console.log(a); a = 20; }
|
输出之前a为10。
1 2 3 4 5
| var a = 10; function aaa(){ console.log(a); var a = 20; }
|
输出a的时候在aaa函数中找到了a的定义(变量的预解析),它相当于下面的代码:
1 2 3 4 5
| function aaa(){ var a; console.log(a); a = 20; }
|
4. 当参数跟局部变量重名的时候,优先级是相同的。
1 2 3 4 5 6
| var a = 10; function aaa(a){ console.log(a); var a = 20; } aaa(a);
|
5. 引用传递
1 2 3 4 5 6
| var a = [1,2,3]; function aaa(a){ a.push(4); } aaa(a); console.log(a);
|
a 按引用传递。
1 2 3 4 5 6
| var a = [1,2,3]; function aaa(a){ a = [1,2,3,4]; } aaa(a); console.log(a);
|
aaa函数执行的时候,在内存中又生成了一个局部变量a,所以全局变量a没有变。