1

我对正在阅读的 javascript 设计模式感到困惑:

var class = (function() {

  ...a bunch of code...

  return {

  .. some more code..

  ;

  // or, in some cases

  return function(constructorArgs) {

  };

})();

我的问题是:return 语句在做什么?为什么会在那里?我很困惑,因为没有人愿意提及或谈论它。

4

4 回答 4

3

我认为你提到了两种不同的模式。

匿名闭包

第一种是使用匿名函数来包装代码块以创建闭包

var outer = (function() {
  var inner = "now you see me!";

  return inner + " now you don't"
})()

匿名函数为var-defined 变量创建了一个新范围。实际上,这允许您定义仅在该特定函数中可见的变量。

在上面的示例中,您可以inner在函数内部访问,但在函数外部没有定义。

“课堂”

第二种是在 JavaScript 中定义“类”的常见模式:

var MyClass = (function() {
  function MyClass(arg) {
    this.arg = arg
  }

  return MyClass
})()

通过在闭包中定义构造函数,您可以确保您的类被很好地包含。它还使您能够共享类范围的状态或私有帮助方法,而不会污染全局命名空间,或者将它们作为属性放置在类构造函数的原型上。

于 2013-01-20T22:35:23.063 回答
2

符号右边的=代码是这种形式:(function(){})(); 它的作用是编译一个函数 - 实际上与以下内容相同:

function temp() {
}

class = temp();

但是,在您的示例中的函数内部,会返回另一个函数。这意味着它class现在也是一个函数 -由于vtortola引用的闭包效应,class该函数可以引用函数中声明的所有变量等。temp

这样做的想法是允许内部函数引用一些您不希望在“全局”(或半全局)范围内徘徊的状态 - 调用方法的位置无关紧要class,或者谁,它将始终可以访问该数据。

编辑:从代码中可以看出,在这种情况下,模式的目的是创建一个“类”类型的函数——这样你就可以使用以下代码调用它:

var myInstance = new class();

虽然我感觉没有任何代码可以工作,因为我有理由确定这class是一个保留字......

于 2013-01-20T22:32:12.990 回答
2

这称为闭包。

var myVar = (function (param1, param2){
    //do things
}('myParam1','myParam2')):

javascript 引擎将立即执行括号之间的内容。

的值myVar将是函数function (param1, param2){ ... }返回的值。

该函数将('myParam1','myParam2')用作参数。

您可以通过两种不同的方式编写闭包:

(function (receivedArgs){
  //do things
})(yourArguments);

或者

(function (receivedArgs){
   //do things
}(yourArguments));
于 2013-01-20T22:36:28.020 回答
1

这是一个封闭。一个函数返回一个在中间包含一些变量的内部函数。

https://developer.mozilla.org/en-US/docs/JavaScript/Guide/Closures

干杯。

于 2013-01-20T22:28:28.300 回答