js模式问题

时间:2013-01-20 22:20:42

标签: javascript oop design-patterns functional-programming

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

var class = (function() {

  ...a bunch of code...

  return {

  .. some more code..

  ;

  // or, in some cases

  return function(constructorArgs) {

  };

})();

我的问题是:什么是返回声明?为什么会这样?我很困惑,因为没有人想提及它或谈论它。

4 个答案:

答案 0 :(得分:3)

我想,你提到的有两种截然不同的模式。

匿名闭包

第一个是使用匿名函数来包装代码块以创建a closure

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

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

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

在上面的示例中,您可以访问函数中的inner,但不会在其外部定义。

“类”

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

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

  return MyClass
})()

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

答案 1 :(得分:2)

=符号右侧的代码具有以下形式:(function(){})();这样做是编译一个函数 - 实际上与以下相同:

function temp() {
}

class = temp();

然而,在您的示例中的函数内部,还有另一个函数被返回。这意味着class现在也是一个函数 - class函数可以引用temp函数中声明的所有变量等,因为引用了闭包效果vtortola

这个想法是允许内部函数引用一些你不想在你的“全局”(或半全局)范围内闲逛的状态 - {{{{调用1}}方法,或者通过总是访问该数据的方法。

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

class

虽然我觉得没有任何代码可以正常工作,因为我有理由确定var myInstance = new class(); 是一个保留字......

答案 2 :(得分: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));

答案 3 :(得分:1)

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

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

干杯。