[英]JavaScript how to assign a new function to original variable via referenced var
我試圖通過另一個引用變量將新函數分配給javascript中的變量。 我有以下代碼:
grp0 =
{
"grp0_0":
{
"grp0_0_0": function()
{
console.log('test', 0, 0, 0);
},
"grp0_0_1": function()
{
console.log('test', 0, 0, 0);
}
},
"grp0_1":
{
"grp0_1_0": function()
{
console.log('test', 0, 1, 0);
},
"grp0_1_1":
{
"grp0_1_1_0": function()
{
console.log('test', 0, 1, 1, 0);
},
"grp0_1_1_1": function()
{
console.log('test', 0, 1, 1, 1);
}
}
},
"grp0_2": function()
{
console.log('test', 0, 2);
}
}
function replaceFunc(group, names)
{
if (typeof group === 'function')
{
console.log('replace function:', names);
group = function()
{
console.log('something else');
}
}
else
{
$.each(group, function(name, value)
{
replaceFunc(value, names.concat(name));
});
}
}
grp0.grp0_1.grp0_1_0();
replaceFunc(grp0, []);
grp0.grp0_1.grp0_1_0();
如預期的那樣,輸出:
test 0 1 0
replace function: ["grp0_0", "grp0_0_0"]
replace function: ["grp0_0", "grp0_0_1"]
replace function: ["grp0_1", "grp0_1_0"]
replace function: ["grp0_1", "grp0_1_1", "grp0_1_1_0"]
replace function: ["grp0_1", "grp0_1_1", "grp0_1_1_1"]
replace function: ["grp0_2"]
test 0 1 0
但我希望最后一行是:
something else
如何更改原始功能?
感謝您的任何幫助。
Javascript函數參數始終按值傳遞,而不是按引用傳遞。 這意味着,盡管您可以更改參數的值,但更改不會反映在調用者一方。
function test(a) {
a = 'd';
}
var b = 'c';
test(b);
console.log(b);
// 'c'; <<= the value has NOT been changed
將對象作為參數傳遞給函數時,它實際上是對傳遞的對象的引用。 但是,引用本身仍然被復制。 這意味着雖然不能替換對象本身,但是可以更改其屬性。
因此,如果要在函數內部更改值,則必須傳遞一個對象; 對該對象屬性的任何更改將對調用函數可見。
function test(p) {
p.a = 'd';
}
var o = {a: 'c'};
test(o);
console.log(o.a);
// 'd'; <<= the property's value HAS been changed
根據Yoshi的評論:
你不能 如果確實要執行此操作,則必須將父對象傳遞給replaceFunc,然后對該對象進行操作。 例如更改屬性。
我將代碼更改為:
function replaceFunc(group, name)
{
if (typeof group[name] === 'undefined') return;
if (typeof group[name] === 'function')
{
group[name] = function()
{
console.log('something else');
}
}
else
{
$.each(group[name], function(n, v)
{
replaceFunc(group[name], n);
});
}
}
grp0.grp0_1.grp0_1_0();
var parent = { groups: grp0 };
replaceFunc(parent, 'groups');
grp0.grp0_1.grp0_1_0();
結果是:
test 0 1 0
something else
非常感謝你
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.