web-dev-qa-db-ja.com

「this」変数を簡単に設定しますか?

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

ありがとう。

136
sam

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

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

これらの関数は、呼び出された関数を呼び出し、objectパラメーターの値をthisに割り当てます。

var myFunction = function(){
    alert(this.foo_variable);
}
myFunction.call( document.body );
217
ForYourOwnGood

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

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

これは、myFunctionthisに設定してobjを呼び出します。

また、わずかに異なるメソッド apply があります。これは、関数パラメーターを配列として受け取ります。

myFunction.apply(obj, [arg1, arg2, ...]);
54
sth

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

var bound = func.bind(someThisValue);

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

bound(); // will call with someThisValue as 'this'
18
pimvdb

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();
0

JavaScriptでthisキーワードを設定します。

Javascriptには、thisキーワードを便利に設定するための3つの組み込みメソッドがあります。これらはすべて_Function.prototype_オブジェクト上にあるため、すべての関数がそれらを使用できます(すべての関数はプロトタイプ継承を介してこのプロトタイプから継承されるため)。これらの機能は次のとおりです。

  1. Function.prototype.call():この関数は、thisとして使用するオブジェクトを最初の引数として受け取ります。その場合、残りの引数は、呼び出される関数のそれぞれの引数です。
  2. Function.prototype.apply():この関数は、thisとして使用するオブジェクトを最初の引数として受け取ります。次に、2番目の引数は、呼び出される関数の引数の値を含む配列です(配列の最初の要素は関数の最初の引数、配列の2番目の引数は関数の2番目の引数など)。
  3. Function.prototype.bind():この関数は、thisの値が異なる新しい関数を返します。 this値として設定するオブジェクトを最初の引数として受け取り、新しい関数オブジェクトを返します。

呼び出し/適用とバインドの違い:

  • callapplyは、関数をすぐに呼び出す(事前定義された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');_
0