4

次の例で、JSLint が暗黙のグローバル変数について不平を言う理由を理解しようとしています。

var TEST = (function () {
  var count = 0;

  function get_count() { 
    return add_one(); 
  }

  function add_one() {
    count += 1;
    return count;
  }

  return { 
    get_count: get_count
  };
}());

これを JSLint で実行すると、次のエラーが発生します。

5 行目の文字 12 の問題: 'add_one' が定義されていません。

言うだけでなく:

暗黙のグローバル: add_one 5

add_one()関数の前に関数を移動するとget_count()、エラーはなくなります。ただし、上記のコードでは、ブラウザで実行してもエラーは発生しません。JSLintが不平を言っている理由を誰でも説明できますか?

ありがとう!
マット

4

3 に答える 3

11

これは、本格的な JavaScript インタープリターではなく、トップダウン パーサーであるPratt ParserJSLintを使用しているためです。それが本当に解釈された場合、そのエラーは発生しません。

add_oneパーサーがまだその変数に遭遇していないため、暗黙のグローバルであるため、周囲のコードにその変数があると想定されます。しかし、ひっくり返すと、パーサーはすでにadd_one変数に遭遇しており、すべて桃とクリームです:-)

ところで、関数の最後の行に小さなタイプミスがあることに気付きました: }());should be })();.

于 2010-10-21T03:15:53.007 に答える
1

*add_one not defined* と表示されるのは、JSLint が関数式を正しい順序で宣言する必要があると考えているためです。他の問題 ("*Implied global: add_one 5*") については、/*globals add_one * などのコメントを入れるだけで十分です。 / スクリプトの先頭に

于 2010-12-15T00:46:25.070 に答える
1

メソッドが宣言されている順序を変更すると、問題が解決します。別の回答で述べたように、一部の JavaScript 解析では、C プログラミング言語と同様に、トップダウンのアプローチでコードを読み取ります。最新のインタープリターとコンパイラーは、2 パスのアプローチを使用しています。最初のパスは、メソッドをメモリに読み込み/コンパイルすることです。認識していないメソッド呼び出しに遭遇した場合、メモリ内のメソッドのセット全体を調べて、存在するかどうかを判断します。順序を修正することをお勧めします。問題が発生しない可能性がありますが、変更によりメソッドがより早くメモリに読み込まれるためです。

var TEST = (function () {
  var count = 0;

  function add_one() {
    count += 1;
    return count;
  }

  function get_count() { 
    return add_one(); 
  }

  return { 
    get_count: get_count
  };
}());
于 2010-10-31T13:49:33.527 に答える