我的代码如下所示:
function x(a,b)
{
return a + b;
}
var f = x;
function x(a,b)
{
return a - b;
}
var res = f(2,1);
我希望结果为3,因为f在修改之前指向函数x,但实际情况并非如此,我如何保持对重新定义的函数的引用?
答案 0 :(得分:4)
在表达式之前处理函数声明。因此,从解释器的角度来看,您的代码被解释为:
function x(a,b)
{
return a + b;
}
function x(a,b)
{
return a - b;
}
var f = x;
var res = f(2,1);
解决方案是使用函数表达式而不是函数声明来重新分配函数。这是因为如上所述,表达式在声明后处理:
function x(a,b)
{
return a + b;
}
var f = x;
x = function (a,b) // <--------- this fixes your problem
{
return a - b;
}
var res = f(2,1);
请注意,由于声明是在表达式之前处理的,因此以下内容也可以使用:
var f = x;
x = function (a,b)
{
return a - b;
}
var res = f(2,1);
function x(a,b) // this is processed first
{
return a + b;
}
答案 1 :(得分:3)
函数和变量声明(但不是变量赋值)是&#34;悬挂&#34;到其包含范围的顶部。
所以你的代码等同于:
function x(a,b) {
return a + b;
}
function x(a,b) { //this overwrites the previous function declaration
return a - b;
}
var f;
var res;
f = x;
res = f(2,1); //1
现在应该清楚为什么f(2,1)
是1而不是2。
您可以通过将函数创建为变量来克服此问题:
var x = function(a, b) {
return a + b;
}
var f = x;
console.log(f(2, 1)); //3
var x = function(a, b) {
return a - b;
}
var f = x;
console.log(f(2, 1)); //1
&#13;
答案 2 :(得分:2)
创建变量时将函数分配给变量:
var f1 = function(a, b) {
return a + b;
}
var f2 = f1;
f1 = function(a, b) {
return a - b;
}
alert( f1(2,1) ); // < Will subtract
alert( f2(2,1) ); // < Will add
这使您可以轻松克隆该功能。