gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 04:10:54 25 4
gpt4 key购买 nike

编辑

有了很多回复说“你可以做私有(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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com