首页 > 一个javascript的问题

一个javascript的问题

myname = "global"; // 全局变量
function func() {
    alert(myname); // "undefined"
    var myname = "local";
    alert(myname); // "local"
}
func();

我想知道为什么结果是这样的?

这段代码相当于下面这样吗?

myname = "global"; // 全局变量
function func() {
    var myname;
    alert(myname); // "undefined"
    myname = "local";
    alert(myname); // "local"
}
func();

的确是相当与这样的,使用 var 关键字定义的变量,会被提升到作用域顶部,但是赋值操作不会被提升到顶端


对的,声明提升。
变量声明提升


你的相当于是对的。
在JavaScript中所有在作用域中var声明的变量会自动提升到该作用域的顶部。不过ES6中let声明变量是不存在声明提升的。
至于没有打印global就是作用域链的问题了,在作用域链上寻找变量值,作用域类的值是在作用域链前端的,而全局变量在作用域链的最后。当找到了值就不会在往下继续寻找了。所以,值一般不赋在window对象上,因为查值更耗费时间。


这个就叫做变量声明提前

【热门文章】
【热门文章】