次のようなオブジェクト リテラルがあります。
var test = {
one: function() {
},
two: function() {
this.one(); // call 1
test.one(); // call 2
}
};
関数内の呼び出しの違いは何ですかtwo
(オブジェクト リテラル名を使用する場合と を使用する場合this
)?
次のようなオブジェクト リテラルがあります。
var test = {
one: function() {
},
two: function() {
this.one(); // call 1
test.one(); // call 2
}
};
関数内の呼び出しの違いは何ですかtwo
(オブジェクト リテラル名を使用する場合と を使用する場合this
)?
test
関数のクロージャー内で常にtwo
変数にバインドされますが、関数の呼び出し方法によって異なります。関数が通常のオブジェクト メンバー アクセス構文を使用して呼び出された場合、関数を所有するオブジェクトになります。test
this
this
test.two(); // inside, "this" refers to the object "test"
this
を使用して の値を変更できますFunction.prototype.call
。
test.two.call(bar); // inside, "this" refers to the object "bar"
ただし、関数の呼び出し方法に関係なく、 の値は関数test
内で同じままです。two
違いは、2 番目の呼び出しは常にテスト オブジェクトにバインドされるのに対し、これは他のオブジェクトに再バインドされる可能性があることです。
var other = {
one: function () {
alert('other.one');
}
};
// call test.two as a method of object other
test.two.call(other); // calls other.one and test.one