“This” değişkeni kolayca ayarlanabiliyor mu?


139

Ben "bu" değişkeni ayarlamak için güzel bir yol anlayamıyorum dışında, Javascript oldukça iyi bir anlayış var. Düşünmek:

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

Son 4 satır olmadan bunu yapmanın bir yolu var mı? Oldukça sinir bozucu ... Güzel ve zeki olduğunu düşündüğüm anonim bir işlevi bağlamayı denedim, ancak boşuna:

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.

Açıkçası, değişkeni myFunction'a geçirmek bir seçenektir ... ama bu sorunun amacı bu değildir.

Teşekkürler.

Yanıtlar:


221

JavaScript call(), ve içindeki tüm işlevler için iki yöntem tanımlanmıştır apply(). İşlev sözdizimi şuna benzer:

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

Ne bu işlevler yapmak değerini atayarak, onlar üzerinde çağrılan edildi işlevini çağırmak olduğunu nesne için parametre bu .

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

3
Ayrıca, jQuery kullanıyorsanız, $.proxy(function, element)bu işlev her çağrıldığında öğenin bağlamı içinde olacak şekilde kullanabilirsiniz. api.jquery.com/jquery.proxy
Trevin Avery

Başka bir yararlı yöntem.bind()
Soroush Falahati


18

Daha thissonra sorunsuz olarak çağırabilmeniz için (örneğin, bu değere artık erişemediğinizde) değeri bir işleve 'depolamak' istiyorsanız, bunu yapabilirsiniz bind(ancak tüm tarayıcılarda mevcut değildir):

var bound = func.bind(someThisValue);

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

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

7
FYI bind, görünüşe göre IE9 +, FF4 +, Safari 5.1.4+ ve Chrome 7+ (kaynak) sürümlerinde mevcuttur . Ayrıca doğrudan anonim bir fonksiyona bağlanabilir:var myFunction = function(){ /* this = something */ }.bind(something);
Adam

1

Nasıl bağlanacağım konusundaki araştırmam thisbeni buraya getirdi, böylece bulgularımı gönderiyorum: 'ECMAScript 2015' de ok işlevlerini kullanarak bu sözcükleri sözlü olarak ayarlayabiliriz.

Bkz. Https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Functions/Arrow_functions

Onun yerine:

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);
}

Şimdi yapabiliriz:

function Person(){
  this.age = 0;

  setInterval(() => {
    this.age++; // |this| properly refers to the person object
  }, 1000);
}

var p = new Person();

0

thisJavascript'te anahtar kelimeyi ayarlama .

Javascript, thisanahtar kelimeyi uygun şekilde ayarlamak için 3 yerleşik yöntem içerir . Hepsi Function.prototypenesnenin üzerinde bulunurlar, böylece her işlev bunları kullanabilir (çünkü her işlev prototip miras yoluyla bu prototipten miras alır). Bu işlevler şunlardır:

  1. Function.prototype.call(): Bu işlev, thisilk bağımsız değişken olarak kullanmak istediğiniz nesneyi alır . Daha sonra argümanların geri kalanı, çağrılan işlevin ilgili argümanlarıdır.
  2. Function.prototype.apply(): Bu işlev, thisilk bağımsız değişken olarak kullanmak istediğiniz nesneyi alır . Daha sonra ikinci argüman, çağrılan işlevin bağımsız değişkenlerinin değerlerini içeren bir dizidir (dizinin ilk öğesi işlevin ilk bağımsız değişkeni, dizinin ikinci bağımsız değişkeni işlevin ikinci bağımsız değişkeni vb.).
  3. Function.prototype.bind(): Bu işlev, değeri farklı olan yeni bir işlev döndürür this. thisİlk bağımsız değişken olarak değer olarak ayarlamak istediğiniz nesneyi alır ve sonra yeni bir işlev nesnesi döndürür.

Çağrı / uygulama ve bağlama arasındaki fark:

  • callve işlevi hemen çağırmalarıapply gerçeğine benzer (önceden tanımlanmış bir değerle )this
  • bindfarklıdır callve applybu işlev aslında yeni bir fonksiyon döner bağlanması farklı bir ile thisdeğer.

Örnekler:

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');

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.