JavaScript 作用域

1. 外层变量内层可以找到,内层变量外层找不到

1
2
3
4
5
6
7
8
9
var a = 10;
function aaa(){
alert(a);
}
function bbb(){
var a = 20;
aaa();
}
bbb(); //10

函数bbb执行到aaa时会返回第二行进行调用,所以弹出的全局变量

2.var a = 10; 与 a=10; 的区别

1
2
3
4
5
function aaa(){
a = 10;
}
aaa();
console.log(a); // 10
1
2
3
4
5
function aaa(){
var a = 10;
}
aaa();
console.log(a); // not defined
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); // 20, 局部变量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); // 10
a = 20;
}

输出之前a为10。

1
2
3
4
5
var a = 10;
function aaa(){
console.log(a); // undefine
var a = 20;
}

输出a的时候在aaa函数中找到了a的定义(变量的预解析),它相当于下面的代码:

1
2
3
4
5
function aaa(){
var a;
console.log(a); // undefine
a = 20;
}

4. 当参数跟局部变量重名的时候,优先级是相同的。

1
2
3
4
5
6
var a = 10;
function aaa(a){
console.log(a); // 10
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); // [1, 2, 3, 4]

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); // [1, 2, 3]

aaa函数执行的时候,在内存中又生成了一个局部变量a,所以全局变量a没有变。

欢迎关注我的其它发布渠道