一个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();
阅读 3.2k
4 个回答

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

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

这个就叫做变量声明提前

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题