142

「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 に渡すことはオプションです...しかし、それはこの質問のポイントではありません。

ありがとう。

4

5 に答える 5

228

call()JavaScript のすべての関数に対して、 との 2 つのメソッドが定義されていますapply()。関数の構文は次のようになります。

call( /* object */, /* arguments... */ );
apply(/* object */, /* arguments[] */);

これらの関数が行うことは、呼び出された関数を呼び出し、objectパラメーターの値をthisに代入することです。

var myFunction = function(){
    alert(this.foo_variable);
}
myFunction.call( document.body );
于 2009-01-19T09:20:33.577 に答える
58

あなたが探していると思いますcall

myFunction.call(obj, arg1, arg2, ...);

これはmyFunctionset thistoで呼び出しますobj

applyまた、関数パラメーターを配列として受け取る、わずかに異なる method もあります。

myFunction.apply(obj, [arg1, arg2, ...]);
于 2009-01-19T09:19:05.013 に答える
19

this後でシームレスに呼び出すことができるように、値を関数に「保存」したい場合(たとえば、その値にアクセスできなくなった場合)、それを行うことができbindます(ただし、すべてのブラウザーで使用できるわけではありません)。

var bound = func.bind(someThisValue);

// ... later on, where someThisValue is not available anymore

bound(); // will call with someThisValue as 'this'
于 2011-07-08T18:57:41.243 に答える
1

バインド方法を検索し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();
于 2016-10-14T06:32:06.310 に答える