我尝试在一个自执行的匿名函数中 Package 一个JavaScript对象文字。下面的第一个代码示例工作正常,但第二个却不行,我不知道为什么?
- 作品:*
(function(){
return MyApp = {
init: function() {
console.log('MyApp init');
}
}
})();
- 不起作用:*
(function(){
var MyApp = {
init: function() {
console.log('MyApp init');
}
}
return MyApp;
})();
据我所知,SEAF应该执行并立即返回。这就是为什么第一个例子将MyApp作为我可以与之交互的对象返回。我认为将MyApp分配给SEAF内部的变量,然后返回它会做同样的事情,但在:
未捕获引用错误:未定义MyApp
为什么?
3条答案
按热度按时间vyu0f0g11#
因为SEAF的结果(更好的名字是IIFE)没有在任何地方使用。函数返回什么并不重要。现在比较
与
不同之处在于,在第二个函数中,变量前面有一个
var
keyword,这使它成为IEFE的本地变量,而在第一个函数中,它是一个隐式全局变量(您应该避免)。这样,第二个代码片段不会分配给全局范围内的任何东西,并且稍后从外部访问MyApp
将失败并返回错误。最好返回一些值,然后将其赋给全局声明的变量:
qvtsj1bj2#
第一个示例所做的是将MyApp设置为 global 变量-因为变量
MyApp
前面没有var
关键字或点表示法,如果你把MyApp
放在一个自执行函数中,听起来这对你来说并不是一个问题-你真的可以从它中删除return
语句-甚至在同一个函数中定义其他全局变量。你永远不会引用你的顶级函数的结果,所以没有使用那个return
。第二个示例使用
var
将MyApp
设置为局部变量,因此它仅在运行它的函数的上下文中可见。gorkyyrv3#
使用箭头函数的解决方案:
说明:
myApp
被设置为IIFE (Immediately-invoked Function Expression)的结果。init
也可以写成箭头函数。