首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用立即调用的函数表达式时JavaScript提升声明混淆

使用立即调用的函数表达式时JavaScript提升声明混淆
EN

Stack Overflow用户
提问于 2014-09-10 17:46:30
回答 2查看 259关注 0票数 0

弄糊涂了。

代码语言:javascript
复制
var message = "Xinrui Ma";

var call = (function(){
    message = "I am cool";
})();

alert(message);

在我看来,代码将被这样对待:

代码语言:javascript
复制
var message = "Xinrui Ma";

var call = (function(){
    var message;         // it will add message declaration here
    message = "I am cool";
})();

alert(message);        // this should alert the "Xinrui Ma", not the "I am cool", 
                       // cause Hoisting is JavaScript's default behavior of moving all declarations 
                       // to the top of the current scope 

但事实上,它输出了“我很酷”,为什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-09-10 17:49:17

如果在函数中没有变量声明,它将使用包含范围中的变量。它不会创建一个新的局部变量--如果这样做,就不会有任何方法来引用闭包变量。

这与提升无关,只有在声明函数中的变量时才会发生这种情况。如果你写道:

代码语言:javascript
复制
var call = (function() {
    message = "I am cool";
    var message;
})();

在这种情况下,var声明将被悬挂到函数的顶部。

票数 4
EN

Stack Overflow用户

发布于 2017-03-11 18:13:23

var关键字用于创建本地作用域,默认情况下它使用全局范围。因此,这里的消息指向全局范围,您正在修改它。

你可以防止

代码语言:javascript
复制
var message = "Xinrui Ma";

var call = (function(){
    var message = "I am cool";
})();

alert(message);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25771837

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档