如何在JavaScript中返回对象文字

1hdlvixo  于 2023-04-19  发布在  Java
关注(0)|答案(3)|浏览(103)

我尝试在一个自执行的匿名函数中 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
为什么?

vyu0f0g1

vyu0f0g11#

因为SEAF的结果(更好的名字是IIFE)没有在任何地方使用。函数返回什么并不重要。现在比较

(function(){
    MyApp = {…}
})();

(function(){
    var MyApp = {…}
})();

不同之处在于,在第二个函数中,变量前面有一个var keyword,这使它成为IEFE的本地变量,而在第一个函数中,它是一个隐式全局变量(您应该避免)。这样,第二个代码片段不会分配给全局范围内的任何东西,并且稍后从外部访问MyApp将失败并返回错误。
最好返回一些值,然后将其赋给全局声明的变量:

var MyApp = (function(){
    return {…};
})();
qvtsj1bj

qvtsj1bj2#

第一个示例所做的是将MyApp设置为 global 变量-因为变量MyApp前面没有var关键字或点表示法,如果你把MyApp放在一个自执行函数中,听起来这对你来说并不是一个问题-你真的可以从它中删除return语句-甚至在同一个函数中定义其他全局变量。你永远不会引用你的顶级函数的结果,所以没有使用那个return
第二个示例使用varMyApp设置为局部变量,因此它仅在运行它的函数的上下文中可见。

gorkyyrv

gorkyyrv3#

使用箭头函数的解决方案:

var myApp = (() => {
    return {
        init: () => console.log('MyApp init')
    };    
})();
myApp.init();

说明:

  • 全局变量myApp被设置为IIFE (Immediately-invoked Function Expression)的结果。
  • init也可以写成箭头函数。
  • 如果箭头函数在return语句之前没有执行其他逻辑,并且它返回一个对象文字,则可以进一步简化。要从箭头函数返回一个对象文字,请将其括在括号中:
var myApp = (
   () => ({
       init: () => console.log('MyApp init')
   })
)();

相关问题