JSのthis本質
4574 ワード
1、thisとは何ですか?
1.1 グローバルコンテキスト(Global context) )
全体的な動作コンテキストでは、thisは、厳密なモードであるかどうかにかかわらず、グローバルオブジェクトwindowを指す.
1.2ちなみにJSの「厳格モード」と「非厳格モード」
「厳格モード」に入るマークは、次の行の文です.
2、関数コンテキスト(Function context)
関数の内部では、thisの値は関数がどのように呼び出されるかによって決まる.
2.1厳格モードと非厳格モードで直接呼び出し
関数がオブジェクト内のメソッドで呼び出された場合、それらのthisはその関数を呼び出すオブジェクトによって設定されます.
以下の例では、o.f()が呼び出された場合、関数内のthisがoオブジェクトとなります.
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)