我在 javascript 闭包中偶然发现了一个非常奇怪的行为。如果闭包的“全局”变量是一个对象,那么从它到另一个变量的任何赋值都表现得像某种指针。一个简单的代码应该更好地解释我的意思:
function closure() {
var foo = {key1 : 'value 1'};
return {
method: function(){
var bar = foo;
bar.key2 = 'value2';
return 'foo has attributes : ' + foo.key1 + ' and ' + foo.key2
}
}
}
var someVar = closure();
someVar.method(); // returns "foo has attributes : value 1 and value2" (!!!)
我显然希望获得foo has attributes : value 1 and undefined
只是bar
被修改过的......但是,脚本实际上修改了两者bar
并且foo
让我很困惑。
我还注意到,当foo
和bar
是字符串或数字时,一切都按预期工作 - 修改bar
不会影响foo
.
function closure() {
var foo = 10;
return {
method: function(){
var bar = foo;
bar += 1;
return 'foo is : ' + foo + ' and bar is ' + bar
}
}
}
var someVar = closure();
someVar.method(); // returns "foo is : 10 and bar is 11"
我花了整个晚上试图找出这种行为的原因......没有运气。我得到了相同的结果是 SpiderMonkey 和 V8(在 Chrome 和 node.js 上)。
我要做的当然是在不影响 foo 的情况下修改第一个示例中的 bar。任何帮助将不胜感激。