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

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

Спасибо.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
140
0
63 013
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Думаю, вы ищете call:

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

Это вызывает myFunction с this, установленным на obj.

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

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

См. Разделы 15.3.4.3, 15.3.4.4 и 10.1.8 в Спецификации языка ECMAScript: ecma-international.org/publications/files/ECMA-ST/Ecma-262.p‌ df

some 19.01.2009 12:26
Ответ принят как подходящий

Для всех функций в 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

Trevin Avery 30.10.2014 23:31

Еще один полезный метод - .bind()

Soroush Falahati 16.06.2018 23:38

Если вы хотите «сохранить» значение 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);

Adam 28.03.2014 04:51

Мои поиски о том, как привязать 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, поэтому каждая функция может их использовать (поскольку каждая функция наследуется от этого прототипа через прототипное наследование). Эти функции следующие:

  1. Function.prototype.call(): эта функция принимает в качестве первого аргумента объект, который вы хотите использовать как this. Тогда оставшиеся аргументы являются соответствующими аргументами вызываемой функции.
  2. Function.prototype.apply(): эта функция принимает в качестве первого аргумента объект, который вы хотите использовать как this. Тогда второй аргумент - это массив, который содержит значения аргументов вызываемой функции (первый элемент массива является первым аргументом функции, второй аргумент массива является вторым аргументом функции и т. д.).
  3. 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');

Другие вопросы по теме