在JavaScript中将参数作为指针传递

7

请看下面的代码:

var o;

(function (p) {
    p = function () {
        alert('test');
    };
})(o);

o(); // Error: 'o is not a function'

在上述函数中,我创建了一个带有一个参数的匿名函数,并将之前创建的对象作为参数自我调用。 然后,我将这个对象指向一个函数(从新范围内部),最终(尝试)从外部调用它。 我的问题是,如何通过引用传递该参数以更改它所指向的指针?
3个回答

13

你可以利用 Javascript 通过引用传递对象这一事实,实现你想要的效果:

var o = { };

(function (p) {
    p.fn = function () {
        alert('test');
    };
})(o);

o.fn();

7
在JavaScript中,“按引用传递”实际上有点误导性。与其他具有真正“引用”类型的语言相比,JavaScript并不通过引用传递任何内容,它总是按值传递。这个值可能包含一个引用,我想这就是你要表达的意思。 - Crescent Fresh

2

最好按照语言的本意使用它,而不是试图将其弯曲以适应仅在根据不同原则构造的语言中才有意义的习语。

var o = (function(p) {
    return function() {
        alert('test');
    };
})();

o();

我将使用上述惯用语的原因是,如果我想要更改主对象(o)的名称,我只需要从第一行开始更改它(var o;),以及在将其作为参数传递的部分(})(o););我不需要更改匿名函数中的任何内容。 - Andreas Grech

1
当您在示例中传递变量o时,实际上是传递了一个未定义的值,而不是任何引用。您需要做的是发送对象的父级。在这种情况下,是窗口对象(假设您正在使用浏览器)。
(function (p, name) {
    p[name] = function() {
       alert('test');
    };
})(window, "o");
o();

这将传递窗口对象和您的新函数名称。然后将您的函数分配给窗口,现在可以调用它。除非您要使用闭包,否则我建议直接分配函数。

function o() {
    alert('test');
};
o();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接