【发布时间】:2017-09-27 17:55:48
【问题描述】:
考虑以下 sn-p:
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,发现以下修改后的 code 按预期工作:
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