此脚本的输出为: [ [ 1, 2, 3, 4 ], 10 ] [ [ 91, 92, 93, 94 ], 10 ] [ [ 8888, 8888, 8888, 8888 ], 10 ] [ [ 'one ', '二', '三', '四' ], 10 ]
但是如果我取消注释 hogs = [2, 4, 6, 8],则输出为: [ [ 1, 2, 3, 4 ], 10 ] [ [ 1, 2, 3, 4 ], 10 ] [ [ 1, 2, 3, 4 ], 10 ] [ [ 1, 2, 3, 4 ], 10 ]
如果我将其注释掉但未注释 hogs = [333, 444, 555, 666],则输出为: [ [ 1, 2, 3, 4 ], 10 ] [ [ 91, 92, 93, 94 ], 10 ] [ [ 8888, 8888, 8888, 8888 ], 10 ] [ [ 8888, 8888, 8888, 8888 ], 10 ]
我想了解简单的 javascript 闭包足以预测它们的行为。这可能缺少分析引擎的规格吗?我还想知道为什么在一个语句中重新定义整个数组与一次重新分配数组的单个值有如此截然不同的副作用。我害怕变得很有创意,因为我不知道如何预测副作用,而且我在文献中找不到线索。
var x = 10;
var hogs = [1, 2, 3, 4];
var array5 = (function () {
var ar = [];
var z = x;
var w = hogs;
function g() {
ar.push(w);
ar.push(z);
return ar;
} return g;
})()();
console.log(array5);
//hogs = [2, 4, 6, 8]; Uncommenting this prevents array5 from changing.
x = 40;
hogs[0] = 91;
hogs[1] = 92;
hogs[2] = 93;
hogs[3] = 94;
console.log(array5);
hogs[0] = 8888;
hogs[1] = 8888;The output from this script is:
hogs[2] = 8888;
hogs[3] = 8888;
console.log(array5);
// hogs = [333, 444, 555, 666]; Un-commenting this prevents..
hogs[0] = 'one';
hogs[1] = 'two';
hogs[2] = 'three';
hogs[3] = 'four';
x = 40;
console.log(array5);
我不认为你在重复;当你写“你不是说'告诉变量 w 引用任何对象引用”时,你优雅地概括了整个事情。您所说的是“告诉变量 w 引用当前所引用的任何对象”您很乐意花时间详细解释这一点。也许您对学习该语言的人表示同情,他们简单地想象对变量值的搜索在必要时通过范围链一直向外进行到 Object 对象,而在这种情况下,封闭函数中的值被忽略,直到全局中的值范围被一个新的定义所抹杀。很高兴知道更改数组中的值会维护数组本身,完好无损,但有一些新的或改变的价值分配;这与重新定义数组非常不同,使变量指向全新的东西。记忆中一些物体静止不动的图像,而另一些则消失并重新出现在记忆中的其他地方,在我脑海中翩翩起舞;与“睡觉的时间”押韵。对于可能对此感兴趣的任何其他人,所有对象似乎都存在类似的情况,如以下代码所示:
enter code here
var x = 10;
var hogs = {'a': 1, 'b': 2, 'c' : 3, 'd' : 4};
var obj = {};
obj.h = hogs;
var ob5 = (function (arg) {
function g() {
var w = arg;
return w;
} return g;
})(hogs)();
console.log(ob5);
//hogs = [2, 4, 6, 8]; Uncommenting this prevents array5 from changing.
x = 40;
hogs['a'] = 91;
hogs['b'] = 92;
hogs['c'] = 93;
hogs['d'] = 94;
console.log(ob5);
hogs.a = 8888;
hogs.b = 8888;
hogs.c = 8888;
hogs.d = 8888;
console.log(ob5);
hogs = {'a':333, 'b':444, 'c':555, 'd':666}; // Prevents further changes.
hogs.a = 'one';
hogs.b = 'two';
hogs.c = 'three';
hogs.d = 'four';
x = 40;
console.log(ob5);