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

Javascript-在更改函数之前保留对函数的引用,javascript,function,reference,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之前指向函数x,但事实并非如此,我如何保留对即将重新定义的函数的引用?在创建函数时,将函数指定给变量: var f1=函数(a,b){ 返回a+b; } var f2=f1; f1=功能(a,b){ 返回a-b; } 警报

我的代码如下所示:

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之前指向函数x,但事实并非如此,我如何保留对即将重新定义的函数的引用?

在创建函数时,将函数指定给变量:

var f1=函数(a,b){
返回a+b;
}
var f2=f1;
f1=功能(a,b){
返回a-b;
}
警报(f1(2,1));//<将减去

警报(f2(2,1));//<创建变量时,将添加
将函数分配给变量:

var f1=函数(a,b){
返回a+b;
}
var f2=f1;
f1=功能(a,b){
返回a-b;
}
警报(f1(2,1));//<将减去

警报(f2(2,1));//<将添加
函数和变量声明(但不是变量分配)被“提升”到其包含范围的顶部

因此,您的代码与此等效:

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=函数(a,b){
返回a+b;
}
var f=x;
控制台日志(f(2,1))//3.
var x=函数(a,b){
返回a-b;
}
var f=x;

控制台日志(f(2,1))//1
函数和变量声明(但不是变量赋值)被“提升”到其包含范围的顶部

因此,您的代码与此等效:

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=函数(a,b){
返回a+b;
}
var f=x;
控制台日志(f(2,1))//3.
var x=函数(a,b){
返回a-b;
}
var f=x;

控制台日志(f(2,1))//1在表达式之前处理函数声明。因此,从解释器的角度来看,您的代码被解释为:

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

函数声明在表达式之前处理。因此,从解释器的角度来看,您的代码被解释为:

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