Справка, "this" меня сбивает с толку в JavaScript

Работа с JavaScript одна из запутывающих вещей при использовании этого

var x = {  
  ele : 'test',
  init : function(){ 
    alert(this.ele);
  }
}

Однако при работе с несколькими объектами и особенно контекстом событий this изменяется и становится запутанным, чтобы отслеживать/понимать.

Итак, если у кого-то есть лучшие входы/рекомендации/мысли/лучшие практики, пожалуйста, поделитесь. Также я хотел бы знать, дает ли использование this какое-либо преимущество (производительность) или что?

Ответ 1

Это не о производительности, а о доступе к свойству конкретного экземпляра объекта: -

x.init()

Не будет отображаться 'test', если вы не использовали this в этой функции.

Эффективно вышеприведенная строка такая же: -

x.init.call(x);

первый параметр в использовании call присваивается this при выполнении функции.

Теперь рассмотрим: -

var fn = x.init;  //Note no () so the function itself is assigned to the variable fn
fn();

Теперь вы ничего не получаете в оповещении. Это потому, что выше это эффективно: -

fn.call(window);

В браузере Javascript объект window является синонимом глобального объекта. Когда функция вызывается "в raw", то this по умолчанию используется глобальный объект.

Классическая ошибка делает что-то вроде этого: -

var x = {
   ele: 'test';
   init: function(elem) { 
      elem.onclick = function() { alert(this.ele); }
   }
}
x.init(document.getElementById('myButton'));

Однако это не работает, потому что функция, привязанная к событию onclick, вызывается браузером, используя следующий код: -

onclick.call(theDOMElement)

Следовательно, когда функция работает this не так, как вы думаете.

Мое обычное решение этой ситуации: -

var x = {
   ele: 'test';
   init: function(elem) {
      var self = this; 
      elem.onclick = function() { alert(self.ele); }
      elem = null;
   }
}
x.init(document.getElementById('myButton'));

Обратите внимание, что elem = null работает с утечкой памяти IE.

Ответ 2

Это очень запутанно. Это зависит от того, как вы вызываете функцию. Дуг Крокфорд сделал хорошую рецензию в своей книге Javascript, Good Parts. Суть его в этом отличном ответе на иначе плохо сформулированный вопрос.

И нет, это не о производительности.

Ответ 3

Для меня это помогло многим следующим рекомендациям: каждый раз, когда вы видите this думаете owner. Объект, которому принадлежит имя переменной, которому назначена функция, станет this. Если вы не можете понять, кому это принадлежит, тогда this будет окном.

Ответ 4

Хорошая и просветительская статья по ключевому слову this this ( каламбур не предназначен). Статья может прояснить ситуацию для вас, я знаю, что это было для меня.

Существенным правилом является то, что ключевое слово this внутри функции всегда ссылается на владельца функции, а ключом к пониманию последствий является понимание при передаче функций и их копировании. См. Предыдущую статью для примеров.

Ответ 5

использование

var me = this;

вне

function(){

то вы можете сослаться на меня внутри функции()