Javascript - 在更改之前保持对函数的引用

时间:2015-09-24 17:30:58

标签: javascript function reference

我的代码如下所示:

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,但实际情况并非如此,我如何保持对重新定义的函数的引用?

3 个答案:

答案 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。

您可以通过将函数创建为变量来克服此问题:

&#13;
&#13;
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;
&#13;
&#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

这使您可以轻松克隆该功能。