javascript scopeの研究

4638 ワード

まず原則があります.
Javascriptでは、scopeに対する処理は、オブジェクトによって呼び出される関数、例えばo.f()の形であれば、thisポインタは、ここのo.
普通の関数、つまり「点」がないなら、ブラウザにとってこのthisの針はwindowを指します.
テストソースコードを添付します.
 

  
  
  
  
  1. var theAccumulator={ 
  2.                                  
  3.          total:0, 
  4.          clear:function(){ 
  5.                  this.total=0 ; 
  6.                }, 
  7.          add:function(x){ 
  8.                 this.total+=x; 
  9.              }, 
  10.          getResult:function(){ 
  11.               return this.total; 
  12.              } 
  13.                                  
  14. function printResult(f){ 
  15.      alert("result=" + f()); 
  16.                                  
  17. theAccumulator.clear();  
  18. theAccumulator.add(100); 
  19. theAccumulator.add(200);           
  20. printResult(theAccumulator.getResult);   
この場合、なぜundefinedですか?
print Result(theAccemulator.getsResult)はCの中の関数ポインタのような形で伝達されているので、この方式が望ましいです.
 

  
  
  
  
  1. theAccumulator.getResult  
は以下の関数です.

  
  
  
  
  1.   
  2.  
  3. function(){ 
  4.  
  5. return this.total; 
  6.  
  7.  } 
  8.  
  9.   
  10.  
  11.   
オリジナルの書き方はprint Resultと同じです.

  
  
  
  
  1. function(){ 
  2.  
  3. return this.total; 
  4.  
  5.   } 
  6.  
  7. );  
  8.  
  9.   
ここでは、括弧内部の匿名の方法(すなわちfunction(){}は、何の対象にも呼び出されていないことが分かります.だから、彼の関数体の中のthisはwindowを指しています.windowというscopeにはtotalというメンバーがいません.
この考えに基づいて、さらなるテストを行いました.そこで、JSONオブジェクトの不変性と大域関数の不変性を維持しながら、小さなテストを行いました.結果は検証が完全に正しいです.
 
私の変化は:

  
  
  
  
  1. printResult(function(){return theAccumulator.getResult();}); 
その他不変
 
私の考えは、今のこのgetResultは、「点」という形で呼び出されたので、thisポインタは前のscope、つまりtheAccuulatorのオブジェクトを指しているはずですが、theAcceumulatorオブジェクトは、getsResult()メソッドがありますので、彼は解析できます.
 
テストしたら、やっぱりOKです.
本文は「平行線の凝縮」のブログから来ました.転載は作者と連絡してください.