我可以从另一个函数中重新定义JavaScript函数吗?

Wal*_*osz 4 javascript scope function

我想将函数引用"go"传递给另一个函数"redefineFunction",并在"redefineFunction"中重新定义"go".根据Johnathan Snook的说法,函数是通过引用传递的,所以我不明白为什么go()在将它传递给redefineFunction()时没有重新定义.有什么东西我错过了吗?

// redefineFunction() will take a function reference and
// reassign it to a new function
function redefineFunction(fn) {
    fn = function(x) { return x * 3; };
}

// initial version of go()
function go(x) {
    return x;            
}

go(5); // returns 5

// redefine go()
go = function(x) {
     return x * 2;        
}

go(5); // returns 10

// redefine go() using redefineFunction()
redefineFunction(go);

go(5); // still returns 10, I want it to return 15
Run Code Online (Sandbox Code Playgroud)

或者看看我的小提琴http://jsfiddle.net/q9Kft/

jos*_*736 8

Pedants会告诉你JavaScript是纯粹的值传递,但我认为只会覆盖问题,因为传递的(传递对象时)是对该对象的引用.因此,当您修改对象的属性时,您正在修改原始对象,但如果您完全替换该变量,那么您实际上是放弃了对原始对象的引用.

如果你试图在全局范围内重新定义一个函数:(这是一件坏事;你通常不应该有全局函数)

function redefineFunction(fn) {
    window[fn] = function() { ... };
}

redefineFunction('go');
Run Code Online (Sandbox Code Playgroud)

否则,您必须返回新功能并在主叫方分配.

function makeNewFunction() {
    return function() { ... };
}

go = makeNewFunction();
Run Code Online (Sandbox Code Playgroud)