Установить" эту " переменную легко?


у меня довольно хорошее понимание Javascript, за исключением того, что я не могу найти хороший способ установить переменную "this". Рассмотрим:

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 128

4 ответа:

есть два метода, определенные для всех функций в JavaScript,call() и apply(). Синтаксис функции выглядит следующим образом:

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

эти функции вызывают функцию, на которую они были вызваны, присваивая значение объект до этой.

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

Я думаю, что вы ищете call:

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

это myFunction С this значение obj.

есть также немного другой метод apply, который принимает параметры функции в виде массива:

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

Если вы хотите 'хранить'this значение функции, чтобы вы могли легко вызвать ее позже (например, когда у вас больше нет доступа к этому значению), вы можете bind (предусмотрено не во всех браузерах, хотя):

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