javascript scopeの研究
4638 ワード
まず原則があります.
Javascriptでは、scopeに対する処理は、オブジェクトによって呼び出される関数、例えばo.f()の形であれば、thisポインタは、ここのo.
普通の関数、つまり「点」がないなら、ブラウザにとってこのthisの針はwindowを指します.
テストソースコードを添付します.
print Result(theAccemulator.getsResult)はCの中の関数ポインタのような形で伝達されているので、この方式が望ましいです.
この考えに基づいて、さらなるテストを行いました.そこで、JSONオブジェクトの不変性と大域関数の不変性を維持しながら、小さなテストを行いました.結果は検証が完全に正しいです.
私の変化は:
私の考えは、今のこのgetResultは、「点」という形で呼び出されたので、thisポインタは前のscope、つまりtheAccuulatorのオブジェクトを指しているはずですが、theAcceumulatorオブジェクトは、getsResult()メソッドがありますので、彼は解析できます.
テストしたら、やっぱりOKです.
本文は「平行線の凝縮」のブログから来ました.転載は作者と連絡してください.
Javascriptでは、scopeに対する処理は、オブジェクトによって呼び出される関数、例えばo.f()の形であれば、thisポインタは、ここのo.
普通の関数、つまり「点」がないなら、ブラウザにとってこのthisの針はwindowを指します.
テストソースコードを添付します.
- var theAccumulator={
-
- total:0,
- clear:function(){
- this.total=0 ;
- },
- add:function(x){
- this.total+=x;
- },
- getResult:function(){
- return this.total;
- }
- }
-
- function printResult(f){
- alert("result=" + f());
- }
-
- theAccumulator.clear();
- theAccumulator.add(100);
- theAccumulator.add(200);
- printResult(theAccumulator.getResult);
この場合、なぜundefinedですか?print Result(theAccemulator.getsResult)はCの中の関数ポインタのような形で伝達されているので、この方式が望ましいです.
- theAccumulator.getResult
は以下の関数です.
-
-
- function(){
-
- return this.total;
-
- }
-
-
-
-
オリジナルの書き方はprint Resultと同じです.
- function(){
-
- return this.total;
-
- }
-
- );
-
-
ここでは、括弧内部の匿名の方法(すなわちfunction(){}は、何の対象にも呼び出されていないことが分かります.だから、彼の関数体の中のthisはwindowを指しています.windowというscopeにはtotalというメンバーがいません.この考えに基づいて、さらなるテストを行いました.そこで、JSONオブジェクトの不変性と大域関数の不変性を維持しながら、小さなテストを行いました.結果は検証が完全に正しいです.
私の変化は:
- printResult(function(){return theAccumulator.getResult();});
その他不変私の考えは、今のこのgetResultは、「点」という形で呼び出されたので、thisポインタは前のscope、つまりtheAccuulatorのオブジェクトを指しているはずですが、theAcceumulatorオブジェクトは、getsResult()メソッドがありますので、彼は解析できます.
テストしたら、やっぱりOKです.
本文は「平行線の凝縮」のブログから来ました.転載は作者と連絡してください.