「this」変数を設定するニースの方法がわからないことを除いて、私はJavascriptをかなりよく理解しています。考慮してください:
var myFunction = function(){
alert(this.foo_variable);
}
var someObj = document.body; //using body as example object
someObj.foo_variable = "hi"; //set foo_variable so it alerts
var old_fn = someObj.fn; //store old value
someObj.fn = myFunction; //bind to someObj so "this" keyword works
someObj.fn();
someObj.fn = old_fn; //restore old value
最後の4行なしでこれを行う方法はありますか?それはかなり面倒です...私は匿名の関数をバインドしようとしました。
var myFunction = function(){
alert(this.foo_variable);
}
var someObj = document.body; //using body as example object
someObj.foo_variable = "hi"; //set foo_variable so it alerts
someObj.(function(){ fn(); })(); //fail.
明らかに、変数をmyFunctionに渡すことはオプションです...しかし、それはこの質問のポイントではありません。
ありがとう。
this
値を関数に「保存」して、後でシームレスに呼び出すことができるようにする場合(たとえば、その値にアクセスできなくなった場合)、bind
it (ただし、すべてのブラウザで利用できるわけではありません):
var bound = func.bind(someThisValue);
// ... later on, where someThisValue is not available anymore
bound(); // will call with someThisValue as 'this'
this
をバインドする方法を検索してここに来たので、調査結果を投稿しています。「ECMAScript 2015」では、矢印関数を使用してこれを字句的に設定することもできます。
参照: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Functions/Arrow_functions
の代わりに:
function Person() {
setInterval(function growUp() {
// The callback refers to the `self` variable of which
// the value is the expected object.
this.age++;
}.bind(this), 1000);
}
できるようになりました:
function Person(){
this.age = 0;
setInterval(() => {
this.age++; // |this| properly refers to the person object
}, 1000);
}
var p = new Person();
this
キーワードを設定します。Javascriptには、this
キーワードを便利に設定するための3つの組み込みメソッドがあります。これらはすべて_Function.prototype
_オブジェクト上にあるため、すべての関数がそれらを使用できます(すべての関数はプロトタイプ継承を介してこのプロトタイプから継承されるため)。これらの機能は次のとおりです。
Function.prototype.call()
:この関数は、this
として使用するオブジェクトを最初の引数として受け取ります。その場合、残りの引数は、呼び出される関数のそれぞれの引数です。Function.prototype.apply()
:この関数は、this
として使用するオブジェクトを最初の引数として受け取ります。次に、2番目の引数は、呼び出される関数の引数の値を含む配列です(配列の最初の要素は関数の最初の引数、配列の2番目の引数は関数の2番目の引数など)。Function.prototype.bind()
:この関数は、this
の値が異なる新しい関数を返します。 this
値として設定するオブジェクトを最初の引数として受け取り、新しい関数オブジェクトを返します。call
とapply
は、関数をすぐに呼び出す(事前定義されたthis
の値)という点で類似していますbind
は、call
値のバインディングが異なるこの関数新しい関数を返すであるという点で、apply
およびthis
とは異なります。_const thisObj = {
prop1: 1,
prop2: 2,
};
function myFunc(arg1, arg2) {
console.log(this.prop1, this.prop2);
console.log(arg1, arg2);
}
// first arg this obj, other arguments are the
// respective arguments of the function
myFunc.call(thisObj, 'Call_arg1', 'Call_arg2');
// first arg this obj, other argument is an array which
// are the respective arguments of the function
myFunc.apply(thisObj, ['Apply_arg1', 'Apply_arg2']);
// the bind method returns a new function with a different
// this context which is stored in the newMyFunc variable
const newMyFunc = myFunc.bind(thisObj);
// now we can call the function like a normal function
newMyFunc('first', 'second');
_