JavaScript 中,函数及变量的声明都将被提升到函数的最顶部。
JavaScript 中,变量可以在使用后声明,也就是变量可以先使用再声明。
JavaScript 只有声明的变量会提升,初始化的不会。
以上是菜鸟教程中对变量提升的描述
重点在于第三句,我认为是不准确的,初始化的变量也应该存在变量提升
我们可以观察下面五段代码
var tmp = new Date();
function f() {
console.log(tmp);
var tmp = 'hello world';
}
f();
//当我们运行代码,控制台输出的值为undefined
var tmp = new Date();
function f() {
var tmp = 'hello world';
console.log(tmp);
}
f();
//当我们运行代码,控制台输出的值为hello world
var tmp = new Date();
function f() {
console.log(tmp);
}
f();
//当我们运行代码,控制台输出的值为,现在的事件日期
var tmp = new Date();
function f() {
var tmp
console.log(tmp);
}
f();
//当我们运行代码,控制台输出的值为undefined
var tmp = new Date();
function f() {
tmp = 'hello world'
console.log(tmp);
var tmp
}
f();
//当我们运行代码,控制台输出的值为hello world
当进行菜鸟教程中所谓变量初始化的时候,同样输出了undefined
而这恰恰说明了,在变量初始化的时候,同样会发生变量提升,否则系统会提示tmp is not defined,而不是输出undefined,这表明了在初始化变量的时候,确实提升了变量,但没有给该变量进行赋值操作,这导致了控制台输出undefined。
由此我们可以推断,在es5中只要定义了变量,便会存在变量提升问题
所以在浏览器中实际的代码应该是这样的
var tmp = new Date();
function f() {
var tmp
console.log(tmp);
var tmp = 'hello world'
}
f();
函数中的tmp变量确实提升到函数的顶部,并且覆盖了原本外层的tmp变量,但是新覆盖的变量并没有携带值,所以这导致了控制台只能输出undefined
所以说初始化的变量也会提升只不过不携带值