关闭与经典课程

时间:2011-09-21 18:01:04

标签: javascript class closures

我正在使用Node.js.

你能说出使用它(闭包)的优势在哪里:

function sayHello() {
    var num = 0;

    var sayAlert = function (val) {
        num++;
        console.log(num);
    }

    return sayAlert;
}

这个古老的经典之作:

function sayHello2() {
    var num = 0;

    this.sayAlert = function (val) {
        num++;
        console.log(num);
    }

}

var ee1 = sayHello();
ee1(5);
ee1(6);

var ee2 = new sayHello2();

ee2.sayAlert(5);
ee2.sayAlert(6);

(更短的代码可能是关闭和更多“JavaScipt方式”?)

3 个答案:

答案 0 :(得分:3)

看起来你真正想要的是一个带静态计数器的函数。为此你可以使用一个立即执行的函数。

var say = (function() {
   var num = 0;
   return function (val) {
      // Not sure why you're passing val here, it's not used
      num++;
      console.log(num);
   }
})();

除非您想要的是多个计数器,否则您应该使用更好的名称,以便所有阅读它的人都清楚。

function createCounter() {
  var num = 0;
  return function () {
     console.log(++num);
  }
}

在第二个例子中,你通过在构造函数的闭包上使用计数器来实现相同的东西,让它称之为Speaker。

function Speaker() {
  var num = 0;
  this.sayAlert = function()  { 
    console.log(++num);
  }
}

他们都做同样的事情

say(); say();  //outputs 1,2
var speaker = new Speaker();
speaker.sayAlert(); speaker.sayAlert(); //outputs 1,2
var speaker2 = new Speaker();
speaker2.sayAlert(); speaker2.sayAlert(); //outputs 1,2

var ctr1 = createCounter(); ctr1(); ctr1(); //outputs 1,2
var ctr2 = createCounter(); ctr2(); ctr2(); //outputs 1,2

使用哪一个取决于您是想要一个功能还是一个对象。而且主要是你喜欢编写功能代码还是OO代码。

答案 1 :(得分:2)

两者都不是更好。这取决于你的需求。

它们几乎完全相同,除了一个返回一个函数而另一个返回一个包含函数的对象。

答案 2 :(得分:1)

第二个例子允许有多个方法。