关于变量提升的一些新理解

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
所以说初始化的变量也会提升只不过不携带值

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。