Javascript作用域

通过一个案例简述js中变量及函数的作用域的原理。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
alert(x);  // function ①

var x = 10;
alert(x); // 10 ②
x = 20;

function x() {}
alert(x); // 20 ③

if (true) {
var a = 1;
} else {
var b = 1;
}

alert(a); // 1 ④
alert(b); // undefined ⑤

由于js中,所有的var声明会被提前到顶部,并且,变量的作用域是没有块级作用域,所以a和b的作用域实际上是全局的。这段代码实际的执行顺序大致如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
var x;
function x() {}
var a;
var b;

alert(x); // function ①
x = 10;
alert(x); // 10 ②
x = 20;
alert(x); // 20 ③

if (true) {
a = 1;
} else {
b = 1;
}
alert(a); // 1 ④
alert(b); // undefined ⑤

① var x 被 function x() {} 覆盖;

⑤ b被声明,但未赋值,所以是undefined,而不是报未声明的错误。

分享到