再入門JavaScript – Scopeを作る

Filed Under (Uncategorized) by on 28-10-2008

スコープ

javascriptにはPerlのようにレキシカルブロックが明示的に提供されていません。
なので、

JAVASCRIPT:
  1. var i = 0;
  2.  
  3. {
  4.     var i = i;
  5.     i++;
  6.     i++;
  7.     console.log(i); // 2であってほしい
  8. }
  9. console.log(i); // 0であってほしい

このようにはかけません。
もしレキシカルにスコープを生成したい場合にはクロージャを使います。

JAVASCRIPT:
  1. var i = 0;
  2.  
  3. (function(){
  4.     var i = window.i;
  5.     i++;i++;
  6.     console.log(i);
  7. })();
  8. console.log(i);

上記のプログラムはfunction(){}として、無名のクロージャを生成してそのまま実行しています。

ちなみにPerlのレキシカルスコープと少し異なるのは関数の宣言に関してです。

PERL:
  1. # in perl
  2. package XXX;
  3.  
  4. {
  5.   my $val = undef;
  6.   sub get_val{
  7.      return $val;
  8.   }
  9. }

この場合、get_valはCurrent Packageである、XXXのシンボリックテーブルに記憶されますが

JAVASCRIPT:
  1. (function(){
  2.     var val = undefined;
  3.     function getValue(){
  4.         return val
  5.     }
  6.  
  7. })();
  8.  
  9. getValue(); // 関数が見つからない。

javascriptの場合、packageの概念は無いので、レキシカルスコープにはりつきます。

JAVASCRIPT:
  1. var XXX = {};
  2. (function(){
  3.     var val = 11;
  4.     function getValue(){
  5.         return val
  6.     }
  7.     XXX.getValue = getValue;
  8.  
  9. })();
  10.  
  11. XXX.getValue();

レキシカルスコープ上の関数を外部から参照可能にするためにはグローバルから参照可能な
オブジェクトに対して明示的に貼り付けてやる必要があります。

また、
JavaScriptの場合、ファイルベースのレキシカルスコープは存在しないので、
複数のJSの読み込まれているページの場合、それぞれのJSは明示的に
レキシカルスコープを作成する必要があります。

Comments:

Post a comment