Javascritpでは、これは必ずしもオブジェクトメソッドの唯一のコンテキストではありません。
これは、機能の呼び出に完全に依存するグローバルオブジェクト、現在のオブジェクト、または任意のオブジェクトである場合があります。 JavaScriptに関数を呼び出す方法はいくつかあります。オブジェクトメソッドとして、コンストラクターが呼び出すように、およびアプリケーションまたはコールコールを使用します。
1。オブジェクトメソッドを呼び出します
JavaScriptでは、関数もオブジェクトの属性として使用できます。
コードコピーは次のとおりです。
var point = {
x:0、
y:0、
Moveto:function(x、y){
this.x = this.x + x;
this.y = this.y + y;
}
};
point.moveto(1、1)//これは現在のオブジェクトにバインドします。つまり、ポイントオブジェクト
2。関数呼び出しとして
関数は直接呼び出され、これはグローバルオブジェクトにバインドされます。ブラウザでは、ウィンドウはグローバルオブジェクトです。たとえば、次の例:関数が呼び出された場合、これはグローバルオブジェクトにバインドされ、割り当てステートメントが次に実行されます。これは、グローバル変数を暗黙的に宣言することに相当します。
コードコピーは次のとおりです。
関数makenosense(x){
this.x = x;
}
Makenosense(5);
x; // xは5の値でグローバル変数になりました
内部関数、つまり、別の関数の本体内の関数が宣言されている場合、グローバルオブジェクトに結合するこの方法は別の問題を引き起こします。今回は、前述のポイントオブジェクトをMovetoメソッド内の2つの機能を定義し、それぞれxとy座標を翻訳し続けます。結果は予期しない場合があります。ポイントオブジェクトは移動しないだけでなく、2つのグローバル変数XとYがあります。
コードコピーは次のとおりです。
var point = {
x:0、
y:0、
Moveto:function(x、y){
//内部関数
var movex = function(x){
this.x = x; //これはどこに縛られていますか?
};
//内部関数
var movey = function(y){
this.y = y; //これはどこに縛られていますか?
};
movex(x);
movey(y);
}
};
point.moveto(1、1);
point.x; // ==> 0
point.y; // ==> 0
x; // ==> 1
y; // ==> 1
これは、JavaScriptの設計上の欠陥です。これは、この設計上の欠陥を回避するために、内部関数に対応することです。
コードコピーは次のとおりです。
var point = {
x:0、
y:0、
Moveto:function(x、y){
var that = this;
//内部関数
var movex = function(x){
that.x = x;
};
//内部関数
var movey = function(y){
that.y = y;
}
movex(x);
movey(y);
}
};
point.moveto(1、1);
point.x; // ==> 1
point.y; // ==> 1
コンストラクターと呼ばれます
JavaScriptは、主流のオブジェクト指向プログラミング言語とは異なり、オブジェクト指向のプログラミングをサポートしています。それに対応して、JavaScriptのコンストラクターも非常に特別です。別の従来のルールとして、コンストラクターは大文字から始まり、発信者に正しい方法で呼び出すように思い出させます。呼び出しが正しい場合、これは新しく作成されたオブジェクトにバインドされます。
コードコピーは次のとおりです。
関数ポイント(x、y){
this.x = x;
this.y = y;
}
適用または呼び出しを使用して呼び出されます
JavaScript関数はオブジェクトであり、オブジェクトにはメソッドがあり、適用と呼び出しが関数オブジェクトの方法であることを繰り返してみましょう。これらの2つの方法は非常に強力であり、関数実行のコンテキスト、つまりこれに結合したオブジェクトを切り替えることができます。この方法は、多くのJavaScript技術とクラスライブラリで使用されます。具体的な例を見てみましょう。
コードコピーは次のとおりです。
関数ポイント(x、y){
this.x = x;
this.y = y;
this.moveto = function(x、y){
this.x = x;
this.y = y;
}
}
var p1 = new Point(0、0);
var p2 = {x:0、y:0};
p1.moveto(1、1);
p1.moveto.apply(p2、[10、10]);
上記の例では、コンストラクターを使用してオブジェクトP1を生成します。これには、モーモンメソッドもあります。別のメソッドコールにも同じ機能があります。違いは、最後のパラメーターがアレイとして均一に渡されず、個別に渡されることです。
コードコピーは次のとおりです。
function foo(){
//1.この参照コンストラクターは、argument.calleeによって参照されるオブジェクトです
//命令は、新しいオペレーターを介して実行されるコンストラクターです
if(this.constructor == arguments.callee){
alert( 'object created');
}
//2。これはウィンドウであり、それはグローバルコールです
if(this == window){
アラート(「通常のコール」);
}
その他{// 3。
アラート( '+ this.constructorによって呼び出されます);
}
}
foo(); //グローバル関数呼び出し
foo.call(new object()); //オブジェクトオブジェクトのメンバーメソッドとして呼び出す
new foo(); //新しいオペレーターからオブジェクト構築を実行するように呼びかけます