考虑以下代码片段:
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
代码不能正常工作,无限输出“intercept”。然后我搜索了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被提升了。