JavaScriptでは、関数がオブジェクトに属している場合、オブジェクトを介して関数にアクセスする動作は「メソッドコール」と呼ばれます。通常の関数呼び出しとは異なり、メソッドコールを作成するとき、関数のこの参照は変更されます - これは関数を呼び出すために使用されるオブジェクトを参照します(このオブジェクトはメソッド呼び出しの呼び出しコンテキストになります):
コードコピーは次のとおりです。
var x = 99;
var sample = {
X:1、
ACT:function(a){
this.x = a*a; //グローバルオブジェクトのxではなく、サンプルのxに値を割り当てます。
}
}
sample.act(6);
console.log(sample.x); // 36
console.log(x); // 99
JavaScriptは、DOT演算子を使用することに加えて、オブジェクトのプロパティへのアクセスと同様に、ブラケット演算子を使用してメソッド呼び出しを作成することもできます。
コードコピーは次のとおりです。
//メソッドを呼び出す他の方法
サンプル["Act"](7);
console.log(sample.x); // 49
JavaScriptの関数の場合、興味深い動作は、関数に関数(閉鎖)を埋め込むことです。メソッド呼び出しを行うとき、メソッド関数に組み込み関数がある場合、この埋め込み関数のコードは外部変数値にアクセスできます。
コードコピーは次のとおりです。
//ネストされた関数は、その外側の変数にアクセスできます。
var y = 88;
var sample2 = {
y:1、
Act2:function(a){
this.y = inner();
関数内(){
a*aを返します。
}
}
}
SAMPLE2.ACT2(8);
console.log(sample2.y); // 64
console.log(y); // 88
ただし、直感に反して、関数に組み込まれたコードは外部からこれを継承することはできません。つまり、組み込み関数では、これはメソッドを呼び出すオブジェクトではなく、グローバルオブジェクトを指します。
コードコピーは次のとおりです。
//ネストされた関数は「これ」を継承しません。ネストされた関数の「これ」はグローバルオブジェクトです
var sample3 = {
Act3:function(){
inner();
関数内(){
console.log(this); //ウィンドウオブジェクト
}
}
}
sample3.act3();
組み込み関数のメソッドを呼び出すオブジェクトに実際にアクセスする必要がある場合は、この値を外部関数の変数に保存できます。
コードコピーは次のとおりです。
//ネストされた関数に「this」を渡します
var sample4 = {
act4:function(){
var self = this;
inner();
関数内(){
console.log(self); // object {act4 = function()}
}
}
}
sample4.act4();