JSのthis本質

4574 ワード

1、thisとは何ですか?
1.1 グローバルコンテキスト(Global context) )
全体的な動作コンテキストでは、thisは、厳密なモードであるかどうかにかかわらず、グローバルオブジェクトwindowを指す.
 alert(this.document === document); // true



 alert(this === window); // true



 this.a = 37;

 alert(window.a); // 37
thisはデフォルトではwindowの対象を指します.(windowの対象はみんなDOMツリーを見に行くことができます.最高峰です.)
 
1.2ちなみにJSの「厳格モード」と「非厳格モード」
「厳格モード」に入るマークは、次の行の文です.
"use strict";
詳しく紹介しますhttp://www.ruanyifeng.com/blog/2013/01/javascript_strict_mode.html
 
2、関数コンテキスト(Function context)
関数の内部では、thisの値は関数がどのように呼び出されるかによって決まる.
2.1厳格モードと非厳格モードで直接呼び出し
function f1(){

  return this;//      

}

alert(f1() == window); // true
function f2(){

  "use strict"; //        

  return this;

}

alert(f2() == undefined);//true
2.2対象とする方法
関数がオブジェクト内のメソッドで呼び出された場合、それらのthisはその関数を呼び出すオブジェクトによって設定されます.
以下の例では、o.f()が呼び出された場合、関数内のthisがoオブジェクトとなります.
var o = {

  prop: 37,

  f: function() {

    return this.prop;

  }

};

alert(o.f()); //  37
注意したいのですが、呼び出し関数がthisの挙動に全く影響しないように定義されています.前の例では、oを定義する際にそのメンバーfに匿名関数を定義しました.しかし、まず関数を定義してからo.fに付随することもできます.このようにthisの行動も一致します.
var o = {prop: 37};

function independent() {

  return this.prop;

}

o.f = independent;

alert(o.f()); //  37
以下の例:this対象は一番大きいものを探さずに、一番近いものを探します.
o.b = {g: independent, prop: 42};

alert(o.b.g()); // 42           this  o  ,   0.b  
2.3は構成関数として
function C(){

  this.a = 37;

}



var o = new C();

alert(o.a); // 37



function C2(){

  this.a = 37;

  return {a:38};

}



o = new C2();

alert(o.a); // 38
最後の例(関数C 2)では、1つのオブジェクトが戻る間に作成されるので、この新しいオブジェクトは直接廃棄される(this.a)