Javascript 函数声明不应放在块中。使用函数表达式或将语句移动到外部函数的顶部

Javascript 函数声明不应放在块中。使用函数表达式或将语句移动到外部函数的顶部,javascript,jslint,jshint,Javascript,Jslint,Jshint,我有以下代码: if (typeof console === "object" && typeof console.error === "function") { function e(msg) {"use strict"; console.info(msg);} } jsLint给出了以下错误: 函数语句不应放在块中。使用函数表达式或将语句移动到外部函数的顶部 为什么会出现这个错误?这是什么意思?您不应该在if块中创建函数。你最好做以下事情: var e = func

我有以下代码:

if (typeof console === "object" && typeof console.error === "function") {
    function e(msg) {"use strict"; console.info(msg);}
}
jsLint给出了以下错误:

函数语句不应放在块中。使用函数表达式或将语句移动到外部函数的顶部


为什么会出现这个错误?这是什么意思?

您不应该在if块中创建函数。你最好做以下事情:

var e = function(){};

if(typeof console === "object" && typeof console.error === "function"){
    e = function (msg){ ... };
}
解释 从jsLintErrors页面了解警告:

引发此错误是为了突出显示可能无法按预期工作的代码。在大多数环境中,您的代码运行时不会出错,但可能不会以您期望的方式运行。在某些环境中,它可能会导致严重的语法错误

这是因为
Function
声明被提升到它们出现的范围的顶部

因此,不可能使用block语句有条件地声明函数。 例子 让我们用一个简单的例子来探讨这个问题引起的问题:

if(真){
函数示例(){
log('hello');
}
}
最好的情况是代码容易混淆。在上面的示例中,如果条件为true,您只需要声明对函数的访问。然而,当功能被提升到范围的顶部时,其实际解释如下:

函数示例(){
log('hello');
}
如果(真){}
这是危险的,因为它看起来不像基于原始代码所期望的那样。条件块实际上是空的(并且是不必要的),每个人都可以访问该函数,而不管条件的计算结果是true还是false

最坏的情况是浏览器不了解如何处理嵌套函数,并在尝试使用它时抛出语法错误。这取决于运行JavaScript的引擎。看起来Firefox就是这样一个引擎。如果在Firefox中运行以下代码,则在执行以下代码时将抛出错误:

if (typeof console === "object" && typeof console.error === "function") {
    function e(msg) {"use strict"; console.info(msg);}
}
if(真){
示例();
函数示例(){
log('hello');
}

}
信息非常清楚。它建议您将函数移出if块,这是有意义的。但没有说明if块是否会这样做!不知道什么是
was@staypuftman它当然有它的怪癖!!在Chrome中,您还必须考虑严格/非严格模式。如果“使用严格”,则声明不会被提升到If块之外,而在非严格模式下则是如此。因此,最安全的选择是在这个问题上使用lint建议