Javascript 在if语句中放置函数语句
我听说,在JavaScript上下文中,将函数语句放在if语句中是一种不好的做法。为什么会这样?这是一种糟糕的做法,因为函数声明被“提升”到词法范围的顶部,而不管您的代码是否进入Javascript 在if语句中放置函数语句,javascript,Javascript,我听说,在JavaScript上下文中,将函数语句放在if语句中是一种不好的做法。为什么会这样?这是一种糟糕的做法,因为函数声明被“提升”到词法范围的顶部,而不管您的代码是否进入if语句的该部分 例如: var someFunction = function () { var num = 5; if ( num !== 5 ) { function anotherFunction () { console.log( 'hello there' ); }
if
语句的该部分
例如:
var someFunction = function () {
var num = 5;
if ( num !== 5 ) {
function anotherFunction () {
console.log( 'hello there' );
}
}
anotherFunction();
};
someFunction(); // logs out 'hello there'
尽管另一个函数
似乎是在if
语句中声明的,但这对JavaScript引擎来说并不重要,因为所有函数声明都被提升到词法范围的顶部(在本例中,提升到someFunction
函数的词法范围的顶部)。这就是为什么可以在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”,但第二个场景记录“bye bye”的原因是JavaScript引擎将所有函数声明提升到词法范围的顶部。当它提升第一个函数声明时,标识符'anotherFunction'引用带有'hello there'的函数对象。但是,当它提升第二个函数声明时,它只是将另一个函数对象(带有“bye-bye”的对象)分配给现有的标识符另一个函数
您可以看到这是多么误导和混乱,因为它违背了您的期望。这是一种糟糕的做法,因为函数声明被“提升”到词法范围的顶部,而不管您的代码是否进入if
语句的该部分
例如:
var someFunction = function () {
var num = 5;
if ( num !== 5 ) {
function anotherFunction () {
console.log( 'hello there' );
}
}
anotherFunction();
};
someFunction(); // logs out 'hello there'
尽管另一个函数
似乎是在if
语句中声明的,但这对JavaScript引擎来说并不重要,因为所有函数声明都被提升到词法范围的顶部(在本例中,提升到someFunction
函数的词法范围的顶部)。这就是为什么可以在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”,但第二个场景记录“bye bye”的原因是JavaScript引擎将所有函数声明提升到词法范围的顶部。当它提升第一个函数声明时,标识符'anotherFunction'引用带有'hello there'的函数对象。但是,当它提升第二个函数声明时,它只是将另一个函数对象(带有“bye-bye”的对象)分配给现有的标识符另一个函数
您可以看到这是多么令人误解和困惑,因为它违背了您的期望。请注意,将形式为someVariable=function(){}
(不是函数语句)的函数声明放在if块中是可以的。(在这种情况下,someVariable
应该在if语句之前的某个地方声明。)请给出一个代码示例。@nnnnnn我同意您的看法,尽管您描述的场景通常不称为函数声明。相反,它通常被称为创建函数表达式。@wmock-True。实际上,我想用的词是“定义”(但我现在无法编辑该评论)。函数由您所说的函数表达式定义,然后(在我的示例中)分配给前面声明的变量。请注意,将形式为someVariable=function(){}
(不是函数语句)的函数声明放在if块中是可以的。(在这种情况下,someVariable
应该在if语句之前的某个地方声明。)请给出一个代码示例。@nnnnnn我同意您的看法,尽管您描述的场景通常不称为函数声明。相反,它通常被称为创建函数表达式。@wmock-True。实际上,我想用的词是“定义”(但我现在无法编辑该评论)。正如您所说,函数是由函数表达式定义的,然后(在我的示例中)分配给前面声明的变量。解释得很好。谢谢我的印象是,唯一被提升的是一个变量,其函数名的值为“undefined”,而实际的函数体直到后来才分配给该名称。但是——如果我理解正确的话——被提升的是整个函数语句。函数声明被完全提升(实际的函数对象和标识符)。变量声明只使用标识符和值undefined
。很好的解释。谢谢我的印象是,唯一被提升的是一个变量,其函数名的值为“undefined”,而实际的函数体直到后来才分配给该名称。但是——如果我理解正确的话——被提升的是整个函数语句。函数声明被完全提升(实际的函数对象和标识符)。变量声明只使用标识符和值undefined
来提升。