Что будет лучшим именем для Javascript "this"?

Я исхожу из фона Java, с его моделью наследования на основе классов, пытаясь окунуться в модель наследования на основе прототипов на основе Javascript. Часть того, что меня отталкивает, я считаю, что я твердо знаю смысл Java "this", а Javascript "this" - совсем другой зверь. Я понимаю, что Javascript "this" всегда ссылается на вызывающий функцию, а не на область, в которой была определена функция. Я имею в виду, я прочитал это и понимаю поверхностно, что это значит. Но я хотел бы, чтобы понимание было более глубоким, и я думаю, что другое имя для него поможет. Как вы думаете о JS "this"? Вы делаете ментальную замену каждый раз, когда вы сталкиваетесь с ней? Если да - какое слово или фразу вы используете?

Ответ 1

this может быть разумно переименован в context в Javascript.

Это действительно относится к контексту выполнения для текущей области, и хотя этот контекст может быть экземпляром класса, он, безусловно, не должен быть — это может быть любой объект вообще, и он может быть изменен во время выполнения.

Доказательство того, что нет никакой гарантии, что "метод" в Javascript работает с экземпляром "класса", в котором он определен:

function Cat(){

     this.texture = 'fluffy';

     this.greet = function(){
         alert("Pet me, I'm " + this.texture);
     }
 }

 var cat = new Cat();

 // Default to using the cat instance as the this pointer
 cat.greet(); // Alerts "Pet me, I'm fluffy"

 // Manually set the value of the this pointer!
 cat.greet.call({texture: 'scaly'});  // Alerts "Pet me, I'm scaly"

Важно отметить, что значение объекта this полностью не зависит от того, где определена содержащая функция.

Ответ 2

Одно из возможных альтернативных имен будет owner. Это привело бы ваш ум в том направлении, которое владелец может изменить в зависимости от того, какой код вы выполняете.

Этот пример из quirksmode:

В JavaScript this всегда ссылается на "владельца" выполняемой нами функции, или, вернее, на объект, который является функцией. Когда мы определяем нашу верную функцию doSomething() на странице, ее владельцем является страница или, вернее, объект окна (или глобальный объект) JavaScript. Свойство onclick, однако, принадлежит HTML-элементу, к которому принадлежит.

В следующем коде

function doSomething() {
   this.style.color = '#cc0000';
}

и

element.onclick = doSomething;

owner указывает на объект, содержащий метод, когда он выполняется.

------------ window --------------------------------------
|                                          / \           |
|                                           |            |
|                                          this          |
|   ----------------                        |            |
|   | HTML element | <-- this         -----------------  |
|   ----------------      |           | doSomething() |  |
|               |         |           -----------------  |
|          --------------------                          |
|          | onclick property |                          |
|          --------------------                          |
|                                                        |
----------------------------------------------------------

Ответ 3

Я думаю, что JavaScript this намного ближе к Java this, чем вы думаете. В контексте ООП this означает "этот экземпляр". Я думаю, что может быть запутанным в отношении ключевого слова JavaScript this, так это то, что он может иметь различное значение в зависимости от контекста.

Ответ 4

this не является вызывающим функцией (хотя это может быть) или областью, в которой была определена функция (хотя это может быть) - это контекст функции.

Значение сдвига, на которое ссылается @Andrew Hare, вероятно, ближе к источнику вашего замешательства; из-за механизма наследования прототипа JS ключевое слово function может означать, в зависимости от того, как оно используется, что-то ближе к Java class, чем определение метода Java.

Предполагая выполнение в браузере:

var q = this.document; //this is window

var o = new (function pseudoconstructor(){
    this.property = "something else" //the new keyword changed 'this' to mean 'the object I'm about to return'
})();

Ответ 5

Как насчет "JavaScript это"? Это позволит вам привязать вас непосредственно к тому, что вы делаете, а также предоставить мысленное напоминание о том, что концепция 'this', с которой вы работаете в настоящее время, - это концепция JavaScript.

В конце концов, я ожидаю, что вы перестанете называть его "JavaScript это" и просто назовите его 'this', полностью осознав, что это значит в контексте, в котором вы работаете. где вы хотите добраться, в любом случае.

Ответ 6

Я поглощаю новый синтаксис с небольшими интеллектуальными моделями, такими как:

$(document).ready(function() {

  function baffle() {
    alert(this.b);
  }

  function what() {
    this.b = "Hello";
    baffle();
  }

  function huh() {
    this.b = "World";
    baffle();
  }

  what();
  huh();

  }
);

Это плохо - переводится в неряшливый, воображаемый С++ как:

template <class This>
function baffle() {
  alert(This.b);
}

function what() {
  b = "Hello";
  baffle<what>();
}

function huh() {
  b = "World";
  baffle<huh>();
}

what();
huh();

Ответ 7

Я думаю, что this наиболее подходит по историческим причинам. В JavaScript не существует единственной фразы для this для одного размера, поскольку она может не только автоматически присваиваться очень различным ссылкам, например this в контексте процедурной функции или this в контексте объекта, но this также может назначаться скриптором с помощью Function.apply и Function.call.

Однако значение this регулируется только потому, что JavaScript и DOM работают с некоторыми очень странными способами. Например, основным использованием Function.apply является сохранение контекста ссылки на элемент в вызовах событий. Вы увидите это в методе Prototye Function.bind().

this является заполнителем контекста, в котором выполняется эта функция, и трудно получить более конкретную информацию. Однако большинство применений this делают это семантически подходящим ключевым словом. В случае bind(), хотя мы используем методы для произвольного изменения значения this внутри функции, его следует использовать, чтобы сделать this более подходящим, чем было бы без. Многие любительские JavaScript-программисты отбрасываются странным поведением this в обработчиках событий, а Function.apply используется так, чтобы "неправильно".

Ответ 8

Авторефессиональная логика (self или this) позволяет избежать парадоксов в пользу работы, отличной от самости (это). Если он сам (все) сохранит все и все в одном, он может также оставаться статичным без экземпляра и с классом (статическим). Чтобы избежать парадоксов, избегайте самосознания и логики, которые доказывают все истины и наоборот, все доказуемые истины.