Definir “isto” variável facilmente?

Eu tenho uma boa compreensão do Javascript, exceto que eu não consigo descobrir uma boa maneira de definir a variável “this”. Considerar:

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 

Existe uma maneira de fazer isso sem as últimas 4 linhas? É bastante irritante … Eu tentei ligar uma function anônima, que eu achei bonita e inteligente, mas sem sucesso:

 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. 

Obviamente, passar a variável para myFunction é uma opção … mas esse não é o ponto dessa questão.

Obrigado.

Existem dois methods definidos para todas as funções em JavaScript, call() e apply() . A syntax da function é semelhante a:

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

O que essas funções fazem é chamar a function em que foram invocadas, atribuindo o valor do parâmetro object a isso .

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

Eu acho que você está procurando por call :

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

Isso chama myFunction com this conjunto para obj .

Existe também o método um pouco diferente, que usa os parâmetros da function como uma matriz:

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

Se você quiser ‘armazenar’ this valor para uma function para que você possa chamá-lo de forma contínua mais tarde (por exemplo, quando você não tem mais access a esse valor), você pode bind lo (não disponível em todos os navegadores):

 var bound = func.bind(someThisValue); // ... later on, where someThisValue is not available anymore bound(); // will call with someThisValue as 'this' 

Minha pesquisa sobre como vincular this me trouxe aqui, então estou postando minhas descobertas: Em ‘ECMAScript 2015’, também podemos definir esse léxico usando as funções de seta para.

Consulte: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Functions/Arrow_functions

Ao invés de:

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

Nós podemos agora fazer:

 function Person(){ this.age = 0; setInterval(() => { this.age++; // |this| properly refers to the person object }, 1000); } var p = new Person();