12

JSLint 不喜欢这段代码说“在定义之前使用了'b'”

var a = function () {
        b();
    },

    b = function () {
        alert("Hello, world!");
    };

a();   

但对此非常满意

var a, b;

a = function () {
    b();
};

b = function () {
    alert("Hello, world!");
};

a();   

但我没有在我的第二个代码片段中定义任何内容。我只是声明变量 b。

那么为什么 JSLint 会这样做呢?有什么理由我应该首先声明我的所有功能吗?

PS 我知道我可能只是改变了 a 和 b 的顺序,但在实际项目中,我的函数是事件处理程序,有时它们会相互调用,所以这可能是不可能的。

4

3 回答 3

12

如果您的代码编写良好且面向对象,则可以在使用函数之前声明它们。但是 JSLint 设置了很多与你的应用程序功能几乎没有关系的标准,我真的怀疑以一种或另一种方式声明函数会影响性能。

于 2012-10-18T20:32:12.983 回答
11

那么为什么 JSLint 会这样做呢?有什么理由我应该首先声明我的所有功能吗?

是的,否则可能会出现一些意外错误。由于 JavaScript 的“提升”,您的代码有效。这种机制会提取所有隐式或显式声明,并可能导致一些意外结果。

考虑这段代码:

var s = "hello";    // global variable
function foo() {
    document.write(s);   // writes "undefined" - not "hello"
    var s = "test";      // initialize 's'
    document.write(s);   // writes "test"
};
foo();

它被解释如下:

var s = "hello";    // global variable
function foo() {
    var s;               // Hoisting of s, the globally defined s gets hidden
    document.write(s);   // writes "undefined" - now you see why
    s = "test";          // assignment
    document.write(s);   // writes "test"
}
foo();

(示例取自德语维基百科页面:http ://de.wikipedia.org/wiki/Hoisting )

于 2013-07-11T20:56:45.850 回答
3

在 C 中这就是我们所说的前向声明,看起来它在 JSLint 中可能是一样的。JSLint 知道 b 并且此时 b 可能是它所关心的所有函数(但如果它不是函数,它当然会抛出错误)

于 2012-10-18T20:29:11.500 回答