その理由はかなり微妙です。JavaScriptでは、関数がどのように呼び出されるかthis
によって完全に決定されます。の呼び出し中にを設定するには、次のように、オブジェクトから取得した直後に呼び出す必要があります。this
car
getName
getName
car
car.getName() // or
car["getName"]()
Function#call
(または、または を介してFunction#apply
、 の値をthis
明示的に指定できます。)
あなたの例であなたがやっていることは、事実上これです:
// Set f to the result of the assignment expression,
// which is a reference to the getName function
var f = (car.getName = car.getName);
// Call it (separately)
f();
...違います。この方法で呼び出された関数はthis
、グローバル オブジェクト (window
ブラウザーでは ) に設定されます。(strict モードを除く; strict モードthis
ではundefined
.)
詳細(私の貧血ブログから):
オブジェクトの関数が再割り当てされていないことを監視し、そのような状況が発生した場合、このメカニズムが通常どおり this キーワードの割り当てを防止する (変数またはその他を使用する) 一種のメカニズムが存在しますか?オブジェクト)?
その質問に従うかどうかは完全にはわかりませんが、常にプリセット値を持つ関数が必要な場合はthis
、はい、それを行う方法がいくつかあります。
1 つは、新しい ES5 関数を使用することですbind
。
var name = "Jaguar";
var car = {
name: "Ferrari"
};
car.getName = function(){
return this.name;
}.bind(car);
alert((car.getName = car.getName)()); // "Ferrari"
bind
this
指定した引数に常に設定されている関数を返します。
もう 1 つの方法は、クロージャーを使用することです。実際、bind
ES3 では のような関数を非常に簡単に作成できます。
function pseudoBind(func, thisArg) {
return function() {
return func.apply(thisArg, arguments);
};
}
それはすべてを行うわけbind
ではありませんが、this
一部を行います。次に、次のようになります。
var name = "Jaguar";
var car = {
name: "Ferrari"
};
car.getName = pseudoBind(function(){
return this.name;
}, car);
alert((car.getName = car.getName)()); // "Ferrari"
閉鎖の詳細 (ブログから):
将来の仕様では、事前設定された値を持つ関数を作成する宣言的な方法を取得する予定です (それらの構文にはキーワードではなく使用が含まれるため、this
いわゆる「アロー関数」)。=>
function