簡體   English   中英

JavaScript如何通過引用的var將新函數分配給原始變量

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM