Установить" эту " переменную легко?
у меня довольно хорошее понимание 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 ответа:
есть два метода, определенные для всех функций в JavaScript,
call()
иapply()
. Синтаксис функции выглядит следующим образом:call( /* object */, /* arguments... */ ); apply(/* object */, /* arguments[] */);
эти функции вызывают функцию, на которую они были вызваны, присваивая значение объект до этой.
var myFunction = function(){ alert(this.foo_variable); } myFunction.call( document.body );
Если вы хотите 'хранить'
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();