xrea-banner xreaad

Hello, scope chain!

namespace kilrey; / JavaScript / 基本 / Hello, scope chain!

前のページ(Hello, constructor!)へ / 次のページ(Hello, prototype chain!)へ

スコープ・チェーンについて説明します。 JavaScriptの中でもここは判り難いと思いますが、 頑張りましょう。

環境オブジェクトには グローバル環境オブジェクトと実行環境オブジェクトがあります。 (Hello, scope chain! Sample 1)

<html>
  <head>
    <script type="text/javascript">
      var x = "global";
      alert("Hello, "+x+"!");
      (function(){
        var x = "local";
        alert("Hello, "+x+"!");
       });
    </script>
  </head>
</html>
    

最初の x は何にも包まれていない場所で定義されています。 このような場所をグローバル環境オブジェクトと呼びます。 ここで定義された変数には、 その識別子が実行環境オブジェクトによって隠されていない限り、 あらゆる場所から参照出来ます。
二つめの x は関数の内部で定義されています。 このような場所を実行環境オブジェクトと呼びます。 ここで定義された変数には その関数内部で定義された文からしか参照出来ません。
ここでC言語と違う点があるので注意して下さい。 JavaScript では {} のブロックは実行環境を生成しません。 ですので、 (Hello, scope chain! Sample 2)

<html>
  <head>
    <script type="text/javascript">
      if(true){
        var x = "block";
      }
      alert("Hello, "+x+"!");
    </script>
  </head>
</html>
    

というようにブロック内で定義された変数も外部から参照出来ます。


In Deep

実際には参照が定義された地点から見て 最も内側にある変数が返されます。 例えば、関数内で定義された関数を外に取り出した場合、 内側の関数は外側の関数の実行環境オブジェクトへの参照を保持します。 ですので、 (Hello, scope chain! Sample 3)

<html>
  <head>
    <script type="text/javascript">
      var x = "global";
      var func = function(){
        var x = "local";
        return function(){
          return x;
        };
      }();
      alert("Hello, "+func()+"!");
    </script>
  </head>
</html>
    

のようにすることで内部の変数を外部から読み取ることが出来ます。 これを応用することにより private なプロパティを作ることも出来ます。

前のページ(Hello, constructor!)へ / 次のページ(Hello, prototype chain!)へ