我想将一个函数引用"go“传递到另一个函数"redefineFunction”中,并在"redefineFunction“中重新定义"go”。根据Johnathan Snook的说法,函数是passed by reference的,所以我不明白为什么当我将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查看我的fiddle http://jsfiddle.net/q9Kft/或
发布于 2012-05-10 22:01:33
学究会告诉你,JavaScript是纯粹的按值传递,但我认为only clouds the issue,因为传递的值(当传递对象时)是对该对象的引用。因此,当您修改一个对象的属性时,您就是在修改原始对象,但是如果您完全替换了变量,那么您实际上就放弃了对原始对象的引用。
如果你试图在全局范围内重新定义一个函数:(这是一件坏事;你通常不应该有全局函数)
function redefineFunction(fn) {
window[fn] = function() { ... };
}
redefineFunction('go');否则,您将不得不返回新函数并在调用方进行赋值。
function makeNewFunction() {
return function() { ... };
}
go = makeNewFunction();发布于 2012-05-10 21:59:44
在JS中没有任何东西是“通过引用传递”的。有时会传递引用,但它们是通过值传递的。区别很细微,但很重要--首先,这意味着虽然您可以随意操作被引用的对象,但不能以调用者看到的任何方式可靠地替换对象(读取:更改引用本身)(因为引用是通过值传递的,因此只是原始引用的副本;尝试重新分配它的方式与arg是数字或字符串的方式相同)。
有些牛仔会认为你在重新定义一个全局函数,并在名称上搞乱它,以绕过按值传递的限制,但这会在你决定不在所有地方都使用全局函数时引发问题。
真正的解决方案是:返回新函数,让调用者决定如何处理它。(我认为直接在使用函数的代码下重新定义函数是一个非常糟糕的设计决策,但是。我想这可能是有原因的…)
发布于 2012-05-10 22:15:44
斯努克错了。我并不认为指出JavaScript中的所有东西都是通过值传递的(@josh3736 :)是书生气的。Snook的文章完全搞错了。传递基元和传递对象的工作方式完全相同。这些是等效的:
var x = 2;
var y = x;
y = 3; //x is STILL 2.
function stuff(y){
y = 3; //guess what. x is STILL 2
}
stuff(x);/
var x = {stuff: 2};
var y = x;
y = {stuff: 3}; //x.stuff is STILL 2
function stuff(y){
y = {stuff: 3}; //guess what. x.stuff is STILL 2
}
stuff(x);这事很重要。C#和大多数语言都是这样工作的。这就是为什么C#有一个"ref“关键字的原因,当你真的想通过引用传递一些东西的时候。
https://stackoverflow.com/questions/10535463
复制相似问题