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

私が正しく理解していれば、少なくとも2番目のコードスニペットはエラーを返さないはずです。私は間違っていますか?

巻き上げメカニズムを考慮しても、最初のコードスニペットが間違っている理由がわかりません。関数は、関数が定義さaれた後にのみ呼び出されるため、のクロージャになります。私のコードは間違っていますか、それともjsHintは間違っていますか?bba

コードはすべてのブラウザで期待どおりに機能するため、この質問は純粋に学術的なものであることを理解しています。それでも、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 に答える