JavaScriptにおけるメソッド呼び出しの詳細
2154 ワード
JavaScriptでは、functionがオブジェクトに属する場合、オブジェクトを介してそのfunctionにアクセスする行為を「メソッド呼び出し」といいます.一般的な関数呼び出しとは異なり、メソッド呼び出しを行う場合、functionのthisは変化することになります.thisは、そのfunctionを呼び出す対象を指します.
var x = 99;
var sample = {
x:1,
act:function(a){
this.x = a*a;//assign value to sample's x, not global object's x.
}
}
sample.act(6);
console.log(sample.x);//36
console.log(x);//99
訪問先のプロッティと同様に、ポイント番号のオペレータを使用する以外に、JavaScriptでは、中かっこのオペレータを使用して方法を呼び出すことができます.
//other ways to invoke method
sample["act"](7);
console.log(sample.x);//49
JavaScriptのfunctionについては、functionにfunctionを埋め込むことができます.メソッド呼び出しを行う場合、メソッドfunctionに埋め込まれたfunctionがあると、この埋め込まれたfunctionのコードは外部の変数値にアクセスできます.
//nested function can access variable outside of it.
var y = 88;
var sample2 = {
y:1,
act2:function(a){
this.y = inner();
function inner(){
return a*a;
}
}
}
sample2.act2(8);
console.log(sample2.y);//64
console.log(y);//88
ただし、直感とは逆に、functionに埋め込まれたコードは外部からthisを継承できない.つまり、埋め込まれたfunctionでは、thisは呼び出し方法の対象ではなく、グローバルオブジェクトを指します.
//nested function does not inherit "this". The "this" in nested function is global object
var sample3 = {
act3:function(){
inner();
function inner(){
console.log(this);//window object
}
}
}
sample3.act3();
実際に埋め込みfunctionで呼び出し方法のオブジェクトにアクセスする必要がある場合、外部functionでthis値を変数に保存できます.
//pass "this" to nested function
var sample4 = {
act4:function(){
var self = this;
inner();
function inner(){
console.log(self);//Object {act4=function()}
}
}
}
sample4.act4();