• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:javascriptのレキシカルスコープについて)

JavaScriptのレキシカルスコープとは?

このQ&Aのポイント
  • JavaScriptのレキシカルスコープとは、変数のスコープがコード上での位置によって決まる仕組みのことです。
  • レキシカルスコープでは、変数のスコープがその変数が宣言された場所によって決まります。
  • また、レキシカルスコープでは、変数が参照される時には、その変数の定義された位置から外側のスコープに向かって変数を探しに行きます。

質問者が選んだベストアンサー

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4900/10361)
回答No.2

プログラムの実行順序に関係なく、ソースに記述されたネスティング状況通りに変数スコープが決まるのがレキシカルスコープです。 変数を参照するコードが書かれた部分から、ソースの関数定義のネスティングを1段ずつ外側に広げて最初に変数宣言がされている部分がその有効範囲です。ちょっとわかりにくい表現かな。 var num = 100; function makefunc() { return function() { alert(num); } } function callfunc() { var num = 50; var func = makefunc(); func(); }; callfunc(); の例では、alert(num)で出力するnumは、そのすぐ周りの無名関数ではvar宣言されてないので、1つ外側のmakefuncを見てそこでも定義されてないので、グローバルのvar num=100が該当する変数定義です。 ブログラムの実行順序としてはそれより直近でvar num=50が実行されていますが、上に書いた通り、ブログラム実行順序的に直近かどうかなどは関係ないのです。あくまでソース記述上で1つずつ外側を見に行きます。 現在メジャーなほとんどの言語ではレキシカルスコープです。 これと逆に、ソース記述上の位置と無関係に、文が実行された順で直近の変数が有効になるのはダイナミックスコープと言います。

1000vicki
質問者

補足

なるほど・・・。 では、上記の例で仮にjavascriptがレキシカルスコープ(静的スコープ)ではなく 反対のダイナミックスコープであれば、 alert(num)で実行された場合は var num = 50; の値が参照されるということですかね? ちなみに、上記の返信から現在の一般的な言語はレキシカルスコープが主流とのことですが わたしはPHPしかあつかったことがなく PHPはグローバルスコープで初期化された変数はユーザー定義関数の中からは 通常は参照できません。(globalとっいたキーワードを使えば別ですが) このグローバルスコープで初期化された、 変数がユーザ定義関数(関数スコープ内)の中で使える言語仕様が 最初、まったく飲み込めなかったのですが、 このレキシカルスコープおよびダイナミックスコープという仕様は グローバルスコープで初期化した変数が関数スコープの中で参照できる言語仕様のみに 該当するものですよね? 用はPHPはレキシカルスコープでもダイナミックスコープでもないという ことですよね? ちょっとこのへんがいまいちです。 pythonやrubuyでもグローバルな変数をローカル変数からなにもしなくても参照できるのでしょうか?

その他の回答 (1)

  • pringlez
  • ベストアンサー率36% (598/1630)
回答No.1

私は「レキシカルスコープ」という言葉は聞いたことがありませんでしたが、そのサイトを見たらすぐに分かりましたよ。 参照できる同名の変数が別階層に複数あるときに、最も近い階層の変数を参照するんだよー、というだけのことです。 この例では(例が悪いような気がするのですが)、makefuncから参照可能な変数は、100が代入されているものしか存在しません。だから100が参照されるのは当たり前の話です。一番外側を参照するということではありません。 そのサイトでは初心者には理解しにくいように(わざと無駄に)難しくしようとしている印象を受けます。 以下の例なら分かりやすいのではないでしょうか? var num = 100; function func() { var num = 50; alert(num); } func(); alert(num);

関連するQ&A