gpt4 book ai didi

javascript - 是什么导致了这种行为? (结束语和引用文献)

转载 作者:行者123 更新时间:2023-11-28 11:37:05 25 4
gpt4 key购买 nike

我一直在尝试使用自调用匿名函数将方法和变量附加到对象的方法,但遇到了一些我不理解的行为。

我在函数之前定义变量并将其作为参数传递,方法附加到引用,但在外部,name 保持未定义。

var name;
(function(exports) {
exports = {};
exports.method = function() {
// do stuff
};
})(name);

alert(name === undefined); // true

但是当变量在函数外部而不是内部初始化时,会按照我的预期附加正确的属性。

var name2 = {};
(function(exports) {
exports.method = function() {
// do stuff
};
})(name2);

alert(name2 === undefined); // false
alert(name2.method); // method is defined

为什么?

最佳答案

当涉及到闭包时,将函数作用域外部的对象作为参数传递给自执行函数的技巧是一个方便的技巧,而闭包的作用是对外部对象的引用(在第一个示例中存储在 name 中的引用)通过副本(即引用的副本)传递。

通过引用副本对对象进行的任何更改都将在函数外部产生影响,例如在你的第二个例子中

exports.method = function() {
// do stuff
};

向由 name2 标识的对象添加一个方法。但是,如果您像在

中那样覆盖参数所保存的引用
exports = {}

然后,您只需将新引用存储在用于保存原始引用(副本)的同一变量中

有时需要复制技巧,例如使用闭包和迭代变量时例如

var i;
for(i=0,;i<10;i++){
setTimeout(function(){console.log(i)},3000);
}

将打印 9 十次而

var i;
for(i=0,;i<10;i++){
setTimeout((function(i){return function(){console.log(i)};})(i),3000);
}

将打印 0,1,2,3,4,5,6,7,8,9

关于javascript - 是什么导致了这种行为? (结束语和引用文献),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17167031/

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