通过功能和闭包简化创建模块

时间:2017-01-06 20:31:19

标签: javascript

这是来自一本流行的JS书籍的例子,该书例证了使用函数和闭包创建模块。简化,示例看起来像这样

String.prototype.startify = function ( ) {
 var startString = "Start ";
  return function () { return startString + this;};
}();

console.log("Text".startify());

我的问题是,可以将其简化为以下内容,因为它似乎可以达到相同的效果吗?返回函数和执行last()的目的是什么?

String.prototype.startify = function ( ) {
 var startString = "Start ";
 return startString + this;
};

console.log("Text".startify());

1 个答案:

答案 0 :(得分:0)

最后一个()正在调用该函数。想象一下,你有一个函数foo

function foo() { }

如果您想运行此功能,请致电

foo();

现在,如果foo返回一个函数

function foo() {
  return function bar() {
  };
}

你可以做到

var bar = foo();
bar(); // bar is a function

在你的代码中

String.prototype.startify = function ( ) { // foo
  var startString = "Start ";
  return function () {                     // bar
    return startString + this;
  };
}();      // () executes foo immediately

您正在运行“foo”函数并返回“bar”函数,然后将其存储在变量String.prototype.startify上。

foo仅在此处调用一次,与您的第二个示例不同。

所以@Xufox说

  

想象一下var startString = "Start ";是一个非常复杂的表达。在您的第二个代码段中,每次使用startify时都需要运行该表达式。在第一个示例中,它只需要运行一次。

另一个优点是变量startString不会污染文件的其余部分或全局使用仅在特定位置使用的变量,此变量将仅存在于函数“foo”中。