1

別の参照変数を介して、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

元の機能を変更するにはどうすればよいですか?

助けてくれてありがとう。

4

2 に答える 2

1

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
于 2012-11-15T13:29:36.680 に答える
0

Based on the comments from Yoshi:

You can't. If you really want to do this, you'll have to pass the parent-object to replaceFunc and then work on that object. E.g. change a property.

I changed the code to:

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();

which results in:

test 0 1 0
something else

Thank you very much

于 2012-11-15T21:19:17.687 に答える