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