我對這種閉包行爲感到困惑。我讀過幾篇SO文章(包括this one)和MDN關於閉包的文檔,但沒有看到這種行爲的解釋。返回閉包的變量是創建一個副本而不是參考
在下面的代碼示例中,我創建了一個閉包,其中包含變量cache
,修改該變量的函數preload
以及記錄其值的函數report
。它也重視引用那些對象傳遞進來。
'use strict';
var o = {};
(function(obj) {
var cache = {'initialized': false};
function preload(assets, done) {
console.log('Preloading. Value of cache is', cache);
cache = {};
for (var i = 0; i < assets.length; i++) {
cache[assets[i]] = assets[i];
}
}
function report() {
console.log('Cache from inside is ', cache);
}
function get_cache() {
return cache;
}
obj.cache = cache;
obj.preload = preload;
obj.report = report;
})(o);
// {initialized: false}, as expected
o.report();
// {initialized: false}, as expected
console.log('Cache from outside is ', o.cache);
// I expect this to change cache to {1:1, 2:2, 3:3}
o.preload([1, 2, 3]);
// {1:1, 2:2, 3:3}, as expected
o.report();
// {initialized: false}, NOT as expected. Why?
console.log('Cache from outside is ', o.cache);
我的期望是根據我的理解是,當封閉重視cache
所提供的obj
,它被分配閉包內的變量的引用。但是我看到的行爲暗示obj.cache
正在收到關閉cache
的副本。
在哪一點上創建了cache
的副本,爲什麼?
爲什麼你不公開'get_cache'而是'cache'變量的初始值? – Bergi
因爲你正在製作副本:'cache = {}'。請注意,唯一的閉包是變量'cache'本身。變量'obj.cache'不是一個閉包,而是像C或Java或其他語言中的常規引用/指針賦值。因此,它使'obj.cache'指向由'cache'指向的同一對象,而不是變量'cache'本身。換句話說,'obj.cache = cache'通過值將指針分配給緩存(它像大多數編程語言中一樣指針的拷貝) – slebetman