此javascript工厂分配给的参数是什么?

pet*_*haw 4 javascript factory anonymous-function

我试图了解这种JavaScript模式是如何工作的,它是用括号括起来的整个库。我的理解是,括号是确定变量范围的一种方法,但是内部是一个采用参数(全局,工厂)的函数。

我尝试搜索此模式的工作原理,但找不到任何东西。

代码体返回一个可以在其他地方使用的对象,但是我不明白参数的目的globalfactory完成的目的。

我一直在阅读有关附件和匿名函数的信息,但是找不到关于这样定义的附件的任何信息。

(function (global, factory) {
    global.className = factory();
    }  (this, function () {
         ObjectName.prototype = function() {
             /* some code */
         }
         var data = {
              getUsefulData: function(obj) {
                   return new ObjectName(obj, 'usefuldata');
              }
         }
        return data;
    })
);
Run Code Online (Sandbox Code Playgroud)

问题:

  • 如果外部函数没有参数会怎样?
  • 此处为全局变量和变量分配了什么值?

Mad*_*iha 6

您将看到带有两个参数的IIFE(立即调用函数表达式)。考虑以下示例:

const x = (function(a, b) { return a + b; })(5, 6); // x === 11
Run Code Online (Sandbox Code Playgroud)

参数global被分配的参数this(其中,当在顶层使用,是到达的一个普遍的方式全局对象,window对于浏览器和global用于Node.js的),第二个参数factory被分配大(第二)功能。

然后,IIFE将factory函数的结果(实际上是库代码)放在className键(在此模式下也称为名称空间)下的全局对象上。


这是“显示模块模式”的一种变体,只有从factory函数返回的内容才会放置在上global.className,从而使您可以拥有“私有”变量和函数,这些变量和函数不会公开,但仍可供“公共”对象访问。

(function(global, factory) {
  global.myModule = factory();
}(this, function() {
  const privateMessage = 'secret';
  function secret() {
    return privateMessage;
  }

  function open() {
    return 'Message: ' + secret();
  }

  return { open };
}));

window.myModule.open(); // Message: secret
// no way to directly access privateMessage or secret().
Run Code Online (Sandbox Code Playgroud)

  • @tevemadar这是因为解析器的唯一用途是使解析器理解这是[函数表达式](https://developer.mozilla.org/en/docs/web/JavaScript/Reference/Operators/function),而不是[功能声明](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/function),甚至更奇怪的`!function(){}( )或+ function(){}()`的效果相同。使用parens更好:) (2认同)