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/
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)