javascriptオブジェクトが完全に探索記録されていない01:this!which?

2824 ワード

暖かいヒント:作者の登山記録は、あなたなどの大神にはまったく価値がない.
このすべては、阮大神博文がJavascriptを勉強して閉包したからです.
//  1:
var name = "The Window";
var object = {
  name : "My Object",
  getNameFunc : function(){
    return function(){
      return this.name;
    };
  }
};
alert(object.getNameFunc()());
この問題は、クローズドに関するブログに出てきました.「次の二つのコードの運行結果を理解してくれれば、クローズドの運行メカニズムを理解してもいいです.」という私の闘志をかき立てました.
一見すると、外の変数はnameと呼ばれています.対象内にはnameという変数があります.これは作用領域チェーンについての理解を考察しています.ここで戻ってきたのは適切な「My Object」ですが、実行結果は私の顔を強く打ってくれました.しかし、大きな「The Window」が出てきました.このコードの中のthisは一体何を指していますか?さらに、thisをコンソールに印刷した結果、「window」であることが分かりました.問題はthisにありました.私の思った通りにobjectを指したのではなく、グローバルオブジェクトwindowを指したのです.これはなぜ「The Window」に戻りましたか?
//ここで、thisを除いても「My Object」に戻ります.具体的な原因はまだよく分かりません.後で補充します.
また阮大神の出した第二の問題を見て、もっと愚かになりました.
//  2:
var name = "The Window";
var object = {
  name : "My Object",
  getNameFunc : function(){
    var that = this;
    return function(){
      return that.name;
    };
  }
};
alert(object.getNameFunc()());//My Object
これらの行のコードの意味では、getNameFuncthisobjectを指していますが、その内部の関数では、グローバルオブジェクトを指しています.これはどこに行けばいいですか?
Javascriptのthis用法-阮一峰はjs中のthisの方向を徹底的に理解しています.追梦子JS中thisキーワード详细解说-リンゴの小さいダイコンJavaScriptの中で知っていて不完全なthis-Snady
サークルを見て、心の中には普遍的な概念があります.getは基本的な概念thisがそのオブジェクトを呼び出すということです.つまり、オブジェクトが定義されている時はthisは具体的な方向がありません.呼び出しられた時にのみ、thisは彼を呼び出す対象に割り当てられます.まだ問題があります.このobject.getNameFunc()()は実行する時に何が起きましたか?私達は第一の問題に対して何かを変えます.
var name = "The Window";
var object = {
  name : "My Object",
  getNameFunc : function(){
       console.log(this.name)
       return function(){
        console.log(this.name)
        return this.name;
    };
  }
};
object.getNameFunc()//My Object     1
object.getNameFunc()()//The Window     2
実行文1では、getNameFunc()objectオブジェクトによって呼び出されたものであり、関数のthisobjectを指していますので、この結果が出てきました.実行文2では、実行文1の戻り関数として一度実行されたと理解できます.実行されるのは私たちのwindowオブジェクトです.理解しやすいように執行文2を書き換えます.
var getVal = object.getNameFunc()
getVal()//The Window
実際には、実行文2はgetVal()を実行していますが、この関数の実行対象はwindowであるため、上記のような結果が出てきます.問題2を見てみると、var that = this;object.getNameFunc()の実行中に実行されていることがよく分かります.そこで、ここのthisobjectを指し、変数thatに値を与えた後、実際にobjectthatに割り当てました.リリースすることができません.バックした内部関数と一緒にクローズドされていますので、thatを指しています.したがって、タイトル2の最終結果は「My Object」です.
生気が出る
このようにthisという概念を見ると非常に不思議で、多くの対象方面の知識が含まれています.彼の各種の応用方法と原理を徹底的に理解することに対して、非現実的な幻想を生み出しました.その後の文を書く未来のために、私に任せて整理します.
これが見えるのは全部本当の愛です.