显示模块模式的方法

时间:2018-08-07 03:31:30

标签: javascript

我在提出的示例中发现了自己的错误,因此更改了问题的最后一部分。抱歉。


在学习JavaScript模块模式的示例中,我看到了以下代码:

var singletone1 = function() {
  function sayHello() {
    console.log("Hello")
  }
  return {
    sayHello: sayHello
  }
}()

此代码可以很好地用作揭示模块模式的示例。但是我意识到这与IIFE版本具有相同的结果:

var singletone2 = (function() {
  function sayHello() {
    console.log("Hello")
  }
  return {
    sayHello: sayHello
  }
})()

我感到奇怪的原因是,只要我知道,直接运行函数声明就会出错。

// Immediately Invoked Function Declaration
function(){  
  console.log('test');
}()
// => Uncaught SyntaxError: Unexpected token )

要运行此程序,我必须在括号中加上它。这样,它就变成了IIFE。但是对我来说奇怪的是 singletone1 示例仍然可以正常工作。

所以我的问题是在函数声明之间是否加上括号是否有区别?换句话说,不带括号的显示模块模式( singletone1 )和IIFE版本( singletone2 )之间有什么区别吗?

如果它们相同,那么这是运算符优先级的问题-括号是可选的吗?

2 个答案:

答案 0 :(得分:0)

  

此问题的不错答案:

     

"Explain the encapsulated anonymous function syntax"

因此,我得出结论, singletone1 可以正常工作而没有任何问题,并且看起来与 singletone2 等效的原因是,在 equal右边的语句运算符被解释为函数表达式,而不是函数声明,尽管看起来像是声明。

我还了解到,语法上不允许单独使用匿名函数,因为唯一的匿名函数(不分配任何变量)将被解释为函数声明,但是函数声明必须具有名称标识符。这样,我得出结论,匿名函数只能在分配给任何变量后才能使用,或用作IIFE。

如果情况是匿名函数只能解释为函数表达式,则无需在其周围加上括号。在这种情况下,这可以是可选的。

答案 1 :(得分:-2)

评论解释。

    var myLibrary = (function() {

        // reference document only once for performance
        var doc = document;

        // object to expose as public properties and methods
        var pub = {};

        //myLibrary.color
        pub.color = 'red';

        //myLibrary.hello
        pub.hello = function (name) {
            alert('Hello ' + name);
        };

        //API
        return pub;
    }());