我正在尝试将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中的变量然后返回它会做同样的事情,但是在:
Uncaught ReferenceError: MyApp is not defined
为什么?
答案 0 :(得分:3)
由于您的SEAF(更好地命名为IEFE)的结果未在任何地方使用,因此该函数返回的内容并不重要。现在比较
(function(){
MyApp = {…}
})();
与
(function(){
var MyApp = {…}
})();
不同之处在于,在第二个函数中,您的变量前面有一个var
keyword,这使它成为IEFE的本地变量,而在第一个函数中它是一个隐式全局变量(您应该避免)。这样,第二个代码段不会分配给全局范围内的任何内容,稍后从外部访问MyApp
会因错误而失败。
最好返回一些您随后分配给全局声明的变量的值:
var MyApp = (function(){
return {…};
})();
答案 1 :(得分:1)
您的第一个示例是将MyApp设置为全局变量 - 因为变量MyApp
前面没有var
关键字或点表示法,它变为全局。听起来这对你来说实际上并不是一个问题,如果你将MyApp
置于一个自动执行的函数中 - 你真的可以从它中删除return
语句 - 或者甚至在同一个函数中定义其他全局变量功能。你没有引用顶级函数的结果,因此没有使用return
。
您的第二个示例使用MyApp
将var
设置为局部变量,因此它仅在运行它的函数的上下文中可见。
答案 2 :(得分:0)
CL Test.c /Fa
<section class="content">
<div class="modal"></div>
</section>
<div class="side-tab"></div>
// CSS //
.content {
position: relative;
z-index: 1;
}
.modal {
position: fixed;
z-index: 100;
}
.side-tab {
position: fixed;
z-index: 5;
}
设置为IIFE (Immediately-invoked Function Expression)的结果。var myApp = (() => {
return {
init: () => console.log('MyApp init')
};
})();
myApp.init();
也可以写为箭头函数。myApp