说明
来自关于警告 Function statements should not be placed in blocks 的 jsLintErrors 页面:
引发此错误是为了突出显示可能无法按预期工作的代码。在大多数环境中,您的代码将毫无错误地运行,但可能不会以您期望的方式运行。在某些环境中,它可能会导致致命的语法错误。
这是因为Function 声明被提升到它们出现的范围的顶部。
因此,不可能有条件地用块语句声明一个函数。
示例
让我们通过一个简单的例子来探讨这个问题引发的问题:
if (true) {
function example() {
console.log('hello');
}
}
最好的情况是您的代码令人困惑。在上面的例子中,看起来你想做的只是声明对函数的访问 if 条件为真。然而,当函数被提升到作用域的顶部时,它实际上会被这样解释:
function example() {
console.log('hello');
}
if (true) {}
这很危险,因为它看起来不像您根据原始代码所期望的那样。条件块实际上是空的(并且是不必要的),并且每个人都可以访问该函数,无论条件的计算结果是真还是假。
最坏的情况是浏览器不明白如何处理嵌套函数,并在尝试使用它时抛出语法错误。这取决于运行 JavaScript 的引擎。 Firefox 似乎就是这样一种引擎。如果在Firefox中运行以下代码,执行以下代码时会报错:
if (true) {
example();
function example() {
console.log('hello');
}
}
如果您打开控制台,您应该会看到以下错误:
解决方案
那么你怎么能解决这个问题呢?
使用函数赋值而不是函数声明
这里有一个快速细分:
// Declaration
function declarationFunction() {}
// Assignment
var assignmentFunction = function() {}
函数分配没有提升到作用域的顶部。
函数声明被提升到作用域的顶部。
所以要有条件地设置示例函数,只需像这样在块中分配它:
var example;
if (true) {
example = function() {
console.log('hello');
}
}