什么是作用域(scoping)
在JavaScript中,变量的定义并不是以代码块作为作用域的,而是以函数作用作用域的。也就是说,如果变量是在某个函数中定义的,那么它在函数以外的地方是不可见的。而如果该变量是定义在if 或者for这样的代码块中,它在代码块之外是可见的。另外,在JavaScript中,术语“全局变量”指的是定义在所有函数之外的变量,与之相对的是“局部变量”,所指的是在某个函数中的变量。其中,函数内的代码可以像访问自己的局部变量那样访问全局变量,反之则不行。
变量提升
在JavaScript代码运行之前其实是有一个编译阶段的。编译之后才是从上到下,一行一行解释执行。变量提升就发生在编译阶段,它把变量和函数的声明提升至作用域的顶端。(编译阶段的工作之一就是将变量与其作用域进行关联)。
所以对于代码var a =2;来说,编译器看到的是两行代码var a; a = 2;第一个语句是声明语句,在编译阶段处理。第二个语句是赋值语句,在运行阶段处理。
console.log(a); var a = 3;
// undefined
screenshot.png
为什么会出现undefined呢? 变量提升
var x = 1;
console.log(x);
if (true) {
var x = 2;
console.log(x);
}
console.log(x);
function foo() {
var x = 1;
if (x) {
(function () {
var x = 2;
// some other code
}());
}
console.log(x)
}
- 提升的部分只是变量声明,赋值语句和可执行的代码逻辑还保持在原地不动
- 提升只是将变量声明提升到变量所在的变量范围的顶端,并不是提升到全局范围
- 变量声明和函数声明都会得到变量提升,但函数声明会最先得到提升,然后是变量声明。
- 对于函数声明来说,如果定义了相同的函数变量声明,后定义的声明会覆盖掉先前的声明
网友评论