4

通过 jsHint 传递此代码:

var A = function (spec) { 
  "use strict";
  var a = function () {
    return b();
  };

  var b = function () {
    return 5;
  };

  a();
};

返回此错误:

Line 4: return b();
'b' is not defined.

我知道这可能与此处解释的“提升”有关:JavaScript 函数顺序:为什么重要?

但是,以下代码返回相同的错误:

var A = function (spec) { 
  "use strict";
  function a () {
    return b();
  }

  function b () {
    return 5;
  }

  a();
};

如果我理解正确,至少第二个代码片段不应该返回错误。我弄错了吗?

即使考虑到提升机制,我仍然不明白为什么第一个代码片段应该是错误的。函数a仅在b定义函数后调用,所以b会在a's 闭包中。我的代码错了还是 jsHint 错了?

我知道这个问题纯粹是学术性的,因为代码在所有浏览器中都按预期工作。不过,我想知道为什么 jsHint 会抛出错误。

4

3 回答 3

4

这是 jsLint 中的误报。
您的两个代码片段都可以正常工作。

忽略警告。

于 2011-11-07T18:26:45.897 回答
2

第一个例子是一个提升问题,因为 a() 在声明之前引用了 b()。解决方案是使用 'var a, b;' 在你的“使用严格”之后;陈述。

于 2011-11-07T18:32:50.420 回答
0

jsHint 试图通过指出潜在问题和非常规代码来帮助您。

在这种情况下,它并不高兴,因为人类可能难以理解——即使它是完全有效的 Javascript。

于 2011-11-07T18:30:51.183 回答