Javascript 为什么此函数表达式的行为与函数声明不同?
考虑以下代码段:Javascript 为什么此函数表达式的行为与函数声明不同?,javascript,Javascript,考虑以下代码段: function myFunction(a){ console.log(a); } myFunction(1); //1 var oldFunction = myFunction; function myFunction(b){ console.log('intercept'); oldFunction(b); } myFunction(1); //too many calls, console outputs intercept indefini
function myFunction(a){
console.log(a);
}
myFunction(1);
//1
var oldFunction = myFunction;
function myFunction(b){
console.log('intercept');
oldFunction(b);
}
myFunction(1);
//too many calls, console outputs intercept indefinitely
代码无法正常工作,并无限期地输出“截获”。然后我搜索了Stack Overflow,发现下面的修改工作正常:
function myFunction(a){
console.log(a);
}
myFunction(1);//1
var oldFunction = myFunction;
var myFunction = function(b){
console.log('intercept');
oldFunction(b);
}
myFunction(1);
//intercept
//1
我的问题是:为什么第一个代码不能按预期工作?我知道函数声明和函数表达式之间存在差异(主要是由于提升行为),但我仍然感到困惑
编辑:确实是起重行为被误解了。我意识到,如果我按照以下方式执行第一个代码,那么它就可以工作:
eval(`function myFunction(a){
console.log(a);
}
myFunction(1);
//1
var oldFunction = myFunction;`);
eval(`function myFunction(b){
console.log('intercept');
oldFunction(b);
}
myFunction(1);`);
//1
//intercept
//1
这就结束了问题。当我单独执行代码时,很明显函数myFunction正在提升。这是因为提升。在JavaScript中,这意味着它们被“提升”到顶部并首先声明,并且可以在定义它们之前使用:
foo()//日志“在foo中”
函数foo(){
console.log(“in-foo”);
}
在第一个示例中,旧函数
定义为
function myFunction(b){
console.log('intercept');
oldFunction(b); // calls `oldFunction` again
}
function myFunction(a){
console.log(a);
}
在第二个示例中,oldFunction
定义为
function myFunction(b){
console.log('intercept');
oldFunction(b); // calls `oldFunction` again
}
function myFunction(a){
console.log(a);
}
只有这一部分起作用:
function myFunction(a){
console.log(a);
}
myFunction(1);
//1
只要你把剩下的加起来
function myFunction(a){
console.log(a);
}
myFunction(1);
//1
var oldFunction = myFunction;
function myFunction(b){
console.log('intercept');
oldFunction(b);
}
myFunction(1);
//too many calls, console outputs intercept indefinitely
它将失败,因为对于JS引擎来说,它是这样的:(按照正确的顺序)
由于吊装,在您的代码中,此函数
function myFunction(a){
console.log(a);
}
完全消除,并立即替换为
function myFunction(b){
console.log('intercept');
oldFunction(b);
}
甚至在代码中执行一个表达式之前。像第一个代码中的
var oldFunction=myFunction
之类的东西sniplet myFunction被new myFunction覆盖,oldFunction引用相同的函数,因此代码以递归顺序执行。但在第二个代码中,第二个myFunction声明为annomous函数,它不重写旧的myFunction,当调用旧的myFunction时,它只指向第一个myFunction 可能重复的