javascriptの中でthisは違うシーンの使い方と方向について
14860 ワード
本論文では、Javascriptsにおけるthisのオブジェクトとしてのメソッド呼び出し、一般的な関数としての呼び出し、構造関数呼び出し、callまたはappyメソッドを使用して呼び出しなどのシーンでの使用法と指向について紹介します.
1.thisの指向
一般的でないwithとevalを除いた場合、具体的には実際の応用において、thisの指向は大体以下の4つに分けられます.を対象とした方法で起動する. は、一般関数として呼び出される. コンストラクター呼び出し. Function.prototype.callまたはFunction.prototype.appy呼び出し. 1)オブジェクトとしてのメソッド呼び出し
関数をオブジェクトとする方法が呼び出されると、thisはオブジェクトを指します.
関数がオブジェクトの属性として呼び出されない場合、すなわち私たちがよく話している一般的な関数方式であり、このときのthisは常にグローバルオブジェクトを指す.ブラウザのjavascriptでは、このグローバルオブジェクトはwindowオブジェクトです.
JavaScriptにはクラスがありませんが、コンストラクタからオブジェクトを作成することができます.また、new演算子を提供します.
コンストラクタの外観語は普通の関数と似ています.違いは呼び出された方式です.new演算子で関数を呼び出すと、一つのオブジェクトが返されます.通常、コンストラクタの中のthisは戻りのこのオブジェクトを指します.次のコードを参照してください.
一般的な関数と比較して、Funtions.prototype.callまたはFuntion.prototype.applyで、着信関数のthisを動的に変更できます.
1.thisの指向
一般的でないwithとevalを除いた場合、具体的には実際の応用において、thisの指向は大体以下の4つに分けられます.
関数をオブジェクトとする方法が呼び出されると、thisはオブジェクトを指します.
var obj = {
name: 'lenhart,
getName: function() {
alert(this === obj); // true
alert(this.name)
}
};
obj.getName();
2)普通の関数として呼び出す関数がオブジェクトの属性として呼び出されない場合、すなわち私たちがよく話している一般的な関数方式であり、このときのthisは常にグローバルオブジェクトを指す.ブラウザのjavascriptでは、このグローバルオブジェクトはwindowオブジェクトです.
window.name = 'globalName';
var getName = function() {
return this.name;
};
console.log(getName())
時々、divノードの時間関数の内部で、一部のcalback方法があります.calbackは普通の関数として呼び出された時、calback内部のthisはwindowを指しましたが、私達はよく彼にdivノードを指してもらいたいです.次のコードを参照してください.<html>
<body>
<div id="div1"> div</div>
</body>
<script>
window.id = 'window';
document.getElementById('div1').onclick(function(){
alert(this.id); // 'div1'
var callback = function(){
alert(this.id); // 'window'
}
callback();
})
</script>
</html>
この時は簡単な解決策があります.divノードの参照は変数で保存できます.document.getElementById('div1').onclick(function(){
var that = this;
var callback = function(){
alert(that.id); // 'div1'
}
callback();
})
ECMAScript 5のstrictモードでは、この場合のthisはグローバルオブジェクトを指しないように規定されています.undefined:function func(){
"use strict"
alert(this); // :undefined
}
func();
3)コンストラクタの呼び出しJavaScriptにはクラスがありませんが、コンストラクタからオブジェクトを作成することができます.また、new演算子を提供します.
コンストラクタの外観語は普通の関数と似ています.違いは呼び出された方式です.new演算子で関数を呼び出すと、一つのオブジェクトが返されます.通常、コンストラクタの中のthisは戻りのこのオブジェクトを指します.次のコードを参照してください.
var MyClass = function(){
this.name = 'lenhart';
};
var obj = new MyClass();
alert(obj.name); // :'lenhart'
しかし、thisを使ってコンストラクタを呼び出す時、もう一つの問題に注意しなければなりません.もしコンストラクタが明示的にobjectタイプのオブジェクトを返すなら、今回の予算結果は最終的にこの対象に戻ります.var MyClass = function(){
this.name = 'lenhart';
return { //
name: 'anne'
}
};
var obj = new MyClass();
alert( obj.name ); // :'anne'
コンストラクタが明示的に任意のデータを返していない場合、または非オブジェクトタイプのデータを返しても、上記の問題は発生しません.var MyClass = function(){
this.name = 'lenhart';
return 'anne';
}
var obj = new MyClass();
alert( obj.name ); // :'sven'
4)Function.prototype.callまたはFuntions.prototype.appy一般的な関数と比較して、Funtions.prototype.callまたはFuntion.prototype.applyで、着信関数のthisを動的に変更できます.
var obj1 = {
name: 'lenhart',
getName: function(){
return this.name;
}
}
var obj2 = {
name: 'anne'
}
alert( obj1.getName() ); // :'lenhart'
alert( obj1.getName.call( obj2 ) ); // :'anne'
callとapply方法はJavaScriptの関数的な言語特性をよく表しています.JavaScriptでは、関数的な言語スタイルのコードを書くたびに、callとapplyと離れられません.JavaScriptの多くのバージョンのデザインモードでも、callとappyが使われています.