У меня довольно хорошее понимание 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 - это вариант ... но вопрос не в этом.
Спасибо.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Для всех функций в JavaScript определены два метода: call() и apply(). Синтаксис функции выглядит так:
call( /* object */, /* arguments... */ );
apply(/* object */, /* arguments[] */);
Эти функции вызывают функцию, для которой они были вызваны, присваивая значение параметра объект параметру это.
var myFunction = function(){
alert(this.foo_variable);
}
myFunction.call( document.body );
Кроме того, если вы используете jQuery, вы можете использовать $.proxy(function, element), чтобы при каждом вызове этой функции она находилась в контексте element. api.jquery.com/jquery.proxy
Если вы хотите «сохранить» значение this в функции, чтобы вы могли беспрепятственно вызывать ее позже (например, когда у вас больше нет доступа к этому значению), вы можете bind его (хотя доступно не во всех браузерах):
var bound = func.bind(someThisValue);
// ... later on, where someThisValue is not available anymore
bound(); // will call with someThisValue as 'this'
FYI bind, по-видимому, доступен в IE9 +, FF4 +, Safari 5.1.4+ и Chrome 7+ (источник). Вы также можете вызвать привязку непосредственно к анонимной функции: var myFunction = function(){ /* this = something */ }.bind(something);
Мои поиски о том, как привязать 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();
this в javascript.Javascript имеет 3 встроенных метода для удобной установки ключевого слова this. Все они расположены в объекте Function.prototype, поэтому каждая функция может их использовать (поскольку каждая функция наследуется от этого прототипа через прототипное наследование). Эти функции следующие:
Function.prototype.call(): эта функция принимает в качестве первого аргумента объект, который вы хотите использовать как this. Тогда оставшиеся аргументы являются соответствующими аргументами вызываемой функции.Function.prototype.apply(): эта функция принимает в качестве первого аргумента объект, который вы хотите использовать как this. Тогда второй аргумент - это массив, который содержит значения аргументов вызываемой функции (первый элемент массива является первым аргументом функции, второй аргумент массива является вторым аргументом функции и т. д.).Function.prototype.bind(): эта функция возвращает новую функцию с другим значением this. Он принимает объект, который вы хотите установить как значение this, в качестве первого аргумента, а затем возвращает новый объект функции.call и apply похожи тем, что они немедленно вызвать функцию (с предопределенным значением this)bind отличается от call и apply тем, что это функция возвращает новую функцию с другим связыванием значения this.const thisObj = {
prop1: 1,
prop2: 2,
};
function myFunc(arg1, arg2) {
console.info(this.prop1, this.prop2);
console.info(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');
См. Разделы 15.3.4.3, 15.3.4.4 и 10.1.8 в Спецификации языка ECMAScript: ecma-international.org/publications/files/ECMA-ST/Ecma-262.p df