javascript - 封闭类与经典类

标签 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 方式”?)

最佳答案

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

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

使用哪一个取决于您想要函数还是对象。主要是您更喜欢编写函数式代码还是面向对象代码。

关于javascript - 封闭类与经典类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7504430/

相关文章:

javascript - 在现有的 html 结构中动态附加 div 标签

python-3.x - tkinter 类型错误 : function takes 1 positional argument but 2 were given()

用于导入 JAR 文件的 Java 代码

javascript - 即使使用修改上下文的函数也不要修改上下文

Swift:无法在某些闭包中分解元组(例如,使用枚举减少)?

javascript - 为什么这个脚本不删除父元素

javascript - jQuery 删除元素上的包装器,这可能吗?

javascript - jQuery - 结合多个元素选择器与 :not - how

rust - 为什么我不能可变地移动捕获不可变变量?

c# - 如何在C#中为变量创建闭包?