函数声明不应该被放置在块。 使用函数表达式或移动语句外函数的顶部(Function declar

2019-07-18 11:35发布

我有以下代码:

if (typeof console === "object" && typeof console.error === "function") {
    function e(msg) {"use strict"; console.info(msg);}
}

对于其中的JSLint提供了以下错误:

函数语句不应该被放置在块。 使用函数表达式或移动语句外函数的顶部。

为什么给这个错误,这是什么意思?

Answer 1:

你不应该,如果块中创建功能。 你好得多做:

var e = function(){};

if(typeof console === "object" && typeof console.error === "function"){
    e = function (msg){ ... };
}


Answer 2:

说明

大约从警告jsLintErrors页面功能陈述不应被放置在块 :

这个错误被提升到突出的代码,你期望它可能无法正常工作 。 在大多数环境中,您的代码将在您希望的方式运行没有错误,但也许不会。 在某些环境下,可能造成致命的语法错误

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

因此,这是不可能有条件地声明一个功能块语句。

让我们来探讨这个问题,一个简单的例子提出的问题:

if (true) {
    function example() {
        console.log('hello');
    }
}

最理想的情况是,你的代码是混乱的。 在上面的例子中,它看起来像你想要做的,如果条件为真时只申报访问功能是什么。 然而,当功能被提升到范围的顶部,它实际上这样解释:

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');
    }
}


文章来源: Function declarations should not be placed in blocks. Use a function expression or move the statement to the top of the outer function