变量提升 指变量声明语句会被提升到这段代码(变量的作用域)的最前面。
var 的变量提升
JavaScript 变量的另一个不同寻常的地方是,你可以先使用变量稍后再使用 var 声明变量而不会引发异常。这一概念称为变量提升;JavaScript 变量感觉上是被“提升”或移到了函数或语句的最前面。但是,提升后的变量将返回 undefined 值。因此在使用或引用某个变量之后进行声明和初始化操作,这个被提升的变量仍将返回 undefined 值。
例如,在全局作用域:
console.log(x === undefined); // true
var x = 3;
相当于
var x;
console.log(x === undefined); // true
x = 3;
又例如,在函数作用域:
// will return a value of undefined
var myvar = "my value";
(function () {
console.log(myvar); // undefined
var myvar = "local value";
})();
相当于
var myvar = "my value";
(function () {
var myvar;
console.log(myvar); // undefined
myvar = "local value";
})();
let 和 const 的变量提升
在 ECMAScript 6 中,let 和 const 同样会被提升变量到代码块的顶部但是不会被赋予初始值。在变量声明之前引用这个变量,将抛出引用错误(ReferenceError)。这个变量将从代码块一开始的时候就处在一个“暂时性死区”,直到这个变量被声明为止。
console.log(x); // ReferenceError
let x = 3;
相关条目
关于作用域,参见函数章节的作用域条目。
参考
语法和数据类型
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Grammar_and_types
提升
https://developer.mozilla.org/zh-CN/docs/Glossary/Hoisting