我有以下代码:
if (typeof console === "object" && typeof console.error === "function") {
function e(msg) {"use strict"; console.info(msg);}
}
对于其中的JSLint提供了以下错误:
函数语句不应该被放置在块。 使用函数表达式或移动语句外函数的顶部。
为什么给这个错误,这是什么意思?
我有以下代码:
if (typeof console === "object" && typeof console.error === "function") {
function e(msg) {"use strict"; console.info(msg);}
}
对于其中的JSLint提供了以下错误:
函数语句不应该被放置在块。 使用函数表达式或移动语句外函数的顶部。
为什么给这个错误,这是什么意思?
你不应该,如果块中创建功能。 你好得多做:
var e = function(){};
if(typeof console === "object" && typeof console.error === "function"){
e = function (msg){ ... };
}
大约从警告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');
}
}