Javascript 闭包——它们之间有什么区别

标签 javascript closures

编辑

有了很多回复说“你可以做私有(private)的事情!”下面,我也将把它添加到顶部:

我知道您可以在闭包中模拟私有(private)变量。那不是我要问的。我想问的是,鉴于下面的两个示例,我从闭包中“导出”所有内容,这两个示例之间的根本区别是什么。

鉴于这两种创建对象/方法的方法:

var test = {}

test = (function(){
    var a_method = function(print_me){
        return "hello "+print_me;
    }

    return {print_me: a_method};
})();

test.print_me2 = function(print_me2){
   return "hello "+print_me2;
}

test.print_me('world');
>>> returns "hello world"

test.print_me2('world');
>>> returns "hello world"

我知道第一种方法允许使用私有(private)变量(作为一个 Python 开发人员,我并不真正关心使用它),但对我来说这两种方法似乎相当等价,只有第一种看起来“更酷”(如所有大的 javascript 人似乎都是这样做的)并且第二种方式看起来很过时。

那么,有什么区别呢?

我已经仔细阅读了这里的关闭问题——其中大部分围绕您使用它们的内容或原因展开;我了解它们的效用,我只是想知道您为什么要先做后做,以及它有什么好处。

比起猜想,我更喜欢确凿的证据——不是寻找“酷 children 就是这样做的”或“我听说当你使用闭包时 mozilla 的内存使用率更高”,而是寻找定性证据一个比另一个“更好”。

最佳答案

这两种方法的区别在于创建闭包的匿名函数包装器,而且第一种方法替换了整个对象,而第二种方法只是在现有方法中设置一个属性。

向对象添加方法有多种方法。您可以在创建对象时将它们放在那里:

var test = {
  print_me: function(text) { return "hello " + text; }
};

您可以将方法作为属性添加到现有对象:

var test = {};
test.print_me = function(text) { return "hello " + text; };

你可以创建一个构造函数,并向它的原型(prototype)添加方法:

function Test() {}
Test.prototype.print_me = function(text) { return "hello " + text; };
var test = new Test();

由于 Javascript 有一个基于原型(prototype)的对象模型,最后一个是方法是如何创建的。其他方法也是可行的,因为对象属性可以有一个函数作为值。


您可以在需要局部变量的任何代码周围使用函数包装器,因此您可以使用第二种设置属性的方法来做到这一点:

test.print_me2 = (function(){

  var method = function(print_me2) {
    return "hello "+print_me2;
  }

  return method;
})();

关于Javascript 闭包——它们之间有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9211253/

相关文章:

javascript - 捕获 Ajax 调用并在失败时重复

javascript - 使用浏览器后退按钮时,请记住该部分的折叠/展开状态

JavaScript 在 jQuery 创建的内容中无法正常工作

go - 将闭包声明为循环(在性能上下文中)

php - jQuery,$.post() 未访问目标网址

php - 如何让 JSON 与 PHP 一起使用

javascript - 有关闭包和内部IIFE的一些问题

closures - 为什么函数参数的生存期与函数内绑定(bind)的生存期不同?

C++0x 闭包/lambda 示例

validation - Groovy/Grails : How are constraints implemented?