Что было бы лучшим названием для Javascript "this"? - PullRequest
10 голосов
/ 16 июня 2009

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

Ответы [ 8 ]

17 голосов
/ 16 июня 2009

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

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

Доказательство того, что нет никакой гарантии, что «метод» в 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 полностью не зависит от того, где определена содержащая функция .

9 голосов
/ 16 июня 2009

Одно возможное альтернативное имя будет 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 |                          |
|          --------------------                          |
|                                                        |
----------------------------------------------------------
5 голосов
/ 16 июня 2009

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

3 голосов
/ 16 июня 2009

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

Сдвигающее значение, на которое ссылается @Andrew Hare, вероятно, ближе к источнику вашего замешательства; Из-за механизма наследования прототипов JS ключевое слово function может означать, в зависимости от того, как оно используется, что-то ближе к class Java, чем к определению метода 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'
})();
1 голос
/ 16 июня 2009

Как насчет «JavaScript это»? Это позволит вам быть непосредственно привязанным к тому, что вы делаете, а также даст напоминание о том, что концепция «этого», с которой вы сейчас работаете, является концепцией JavaScript.

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

0 голосов
/ 16 июня 2009

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

0 голосов
/ 16 июня 2009

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

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

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

0 голосов
/ 16 июня 2009

Я впитываю новый синтаксис с небольшими простыми типами ментальных моделей, таких как:

$(document).ready(function() {

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

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

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

  what();
  huh();

  }
);

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

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

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

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

what();
huh();
...