Javascriptのthisオブジェクトの初解

2112 ワード

オブジェクト指向のプログラム開発では、thisは通常、直接のオブジェクトを指します.javascriptでは、thisオブジェクトは実行時に関数環境に基づいてバインディングされます.したがって、thisの値もダイナミックであり、thisは現在の関数の所有者オブジェクトを指し、実行時に特定の指向性を決定することができます.本稿では、thisアプリケーションのいくつかのシーンからthisの指向性問題を分析します.
   シーン1:グローバル関数の場合、関数宣言
var name="honey";
function compare(value1,value2){
	var name="shirly";
	alert(this.name);
	var s=value1+value2;

}
compare(1,2);   /*    honey*/
関数は実行時にwindowオブジェクトの実行環境を作成します.関数がアクセスできるスコープの変数とオブジェクトは、実際の呼び出しはwindow.com mpareです.全体の呼び出しではwindowを省略できます.
   シーン二:関数をオブジェクトとする方法で呼び出す
var name="honey";
var person={
	name:'sally',
	gender:'girl',
	say:function(){
			alert(this.name);
	}
}
person.say();  /*    sally*/
関数はオブジェクト内のメソッドとして呼び出されていますので、thisはオブジェクトを指します.もう一つの方法でthisの動態が見られます.
Var test=person.say;
Test() //このように出力されるのはhoneyです.この時の関数の対象はwindowです.
もう一つの特殊なクローズド形式があります.
var name="honey";
var person={
	name:'sally',
	say:function(){
			alert(this.name);
			return function(){
				alert(this.name);
			}
	}
}
person.say()(); //honey,person.say()         ,             window
ここから見ると、thisは実行時に関数を呼び出すオブジェクトを指しています.
   シーン3:コンストラクタにthisを使う
 function person(name,age,job){
	this.name=name;
	this.age=age;
	this.job=job;
	this.sayName=function(){
		alert(this.name);
	};
}
var person1=new person("niki",29,"softWare"); 
実例化後にthisは新しいnewのこの対象を指しました.
場面四:call,appyはthisオブジェクトの指向を修正します.
各関数は、この2つの非継承的な方法を含み、この2つの方法の用途は特定の作用領域内で関数を呼び出すことであり、機能を拡張して機能を実行することができます.オブジェクトは方法との結合関係を必要としません.
var name="sdsd";
var o={name:"shirly"};
function compare(){
	alert(this.name);

}
compare();  //sdsd
compare.call(this); //sdsd
compare.call(window) //sdsd
compare.call(o)   //shirly
callとappyの方法の違いは、後のパラメータの違いです.callはいちいち列挙する必要があります.appyはargmentsオブジェクトに入るだけです.
本来はthisが関数のスコープ内の検索パスでthisのオブジェクト指向を確定したいですが、まとめられていないようですので、thisが現れた場合をまとめて覚えてください.
thisの指向については、この関数またはメソッドを呼び出す対象を指すことを覚えています.