【问题标题】:JavaScript how to assign a new function to original variable via referenced varJavaScript如何通过引用的var将新函数分配给原始变量
【发布时间】:2012-11-15 11:48:39
【问题描述】:

我正在尝试通过另一个引用变量将新函数分配给 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

如何改变原来的功能?

感谢您的帮助。

【问题讨论】:

  • 你不能。如果您真的想这样做,您必须将 parent-object 传递给replaceFunc,然后处理该对象。例如。更改属性。
  • 当然!现在为什么我没有想到...
  • 显然我还不能回答我自己的问题,所以我稍后会发布结果。

标签: javascript function reference


【解决方案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

【讨论】:

  • 感谢您的回复。这一切我都知道,但不知何故我忘记了我可以简单地使用父母来实现我所需要的。
【解决方案2】:

基于 Yoshi 的 cmets:

你不能。如果您真的想这样做,则必须将父对象传递给 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

非常感谢

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-26
    • 1970-01-01
    • 2014-01-24
    • 1970-01-01
    • 2022-08-10
    • 2017-01-27
    • 2017-08-25
    相关资源
    最近更新 更多