我正在使用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方式”?)
答案 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)
第二个例子允许有多个方法。