我听说它声称在if语句中放置一个函数语句在JavaScript的上下文中是不好的做法。为什么会这样?
答案 0 :(得分:4)
这是一种不好的做法,因为函数声明是"悬挂"在您的代码是否进入if
语句的那一部分的词汇范围 REGARDLESS 的顶部。
例如:
var someFunction = function () {
var num = 5;
if ( num !== 5 ) {
function anotherFunction () {
console.log( 'hello there' );
}
}
anotherFunction();
};
someFunction(); // logs out 'hello there'
即使anotherFunction
在if
语句中声明看似,但这对JavaScript引擎并不重要,因为所有函数声明都被提升到顶部词法范围(在这种情况下,到someFunction
函数的词法范围的顶部)。这就是为什么可以在anotherFunction
语句之外调用if
。
在以下情况中,它变得更加麻烦:
var someFunction = function () {
var num = 5;
if ( num === 5 ) {
function anotherFunction () {
console.log( 'hello there' );
}
} else {
function anotherFunction () {
console.log( 'bye bye' );
}
}
anotherFunction();
};
someFunction(); // logs out 'bye bye'
你期待结果是' hello world'但这第二种情况记录的原因是再见'是因为JavaScript引擎将所有函数声明提升到词法范围的顶部。当它提升第一个函数声明时,标识符' anotherFunction'引用函数对象' hello there'。但是,当它提升第二个函数声明时,它只是将另一个函数对象(具有“再见”的对象)分配给现有标识符anotherFunction
。
你可以看出这是多么误导和混淆,因为它违背了你的期望。