0

レキシカルスコープの概念を理解しようとしています。私の知る限り、レキシカルスコープは逆方向には機能しません。以下の JavaScript コードでは、scope3() 関数で変数 'name' を宣言しています。しかし、scope1() および scope2() 関数で呼び出そうとしました。レキシカル スコープは逆方向には機能しないため、"name is undefined" を取得する必要がありましたが、空の文字列が返されます。誰かがこれを説明できますか?

var scope1 = function () {
  // name should have been undefined but its printing empty string
  console.log(name);
  var scope2 = function () {
    // name should have been undefined but its printing empty string
    console.log(name);
    var scope3 = function () {
      var name = 'Todd'; // locally scoped
    };
  };
  scope2();
};
scope1();

4

3 に答える 3

0

レキシカルスコープを正しく理解する必要があります。以下は、概念とその仕組みを説明するための簡単で直接的な例です。

まあ言ってみれば:

function(auto) {
   var vehicle = "bus";
   console.log(vehicle);

   function(innerAuto) {
     console.log(vehicle)
   }
   innerAuto();
}
auto();

したがって、innerAutoこのコンテキストで呼び出される内部関数は、どこにも見つからない vehicle の値をログに記録する命令を取得します。関数はすぐに、それを見つけるために外側のスコープに移動する必要があることを認識します。innerAutoつまり、JS ランタイムは、このコードを実行するときに変数 vehicle の宣言のために関数内を調べる必要がないことを既に認識しています。それで、どうやってこれを知っているのだろうか?これは、コンパイル時に変数宣言がinnerAuto関数内に表示されず、関数内に表示されたためautoです。したがって、レキシカルスコープは単にコンパイル時のスコープです。詳細については、レキシカルスコープとクロージャに関するMDNドキュメントを確認してください。

于 2017-02-25T07:43:56.903 に答える
0

JavaScript にはname組み込みプロパティがあります。nameそのため、 variable が を指しているため、 variableを取得しようとすると、空の文字列が返されwindow.nameます。

名前の代わりに別のものを使用する必要があります。

于 2016-02-29T06:27:26.700 に答える