JavaScript новые ключевые слова и области видимости объектов - PullRequest
3 голосов
/ 04 августа 2010

Позже сегодня я просматривал слайды ejhon.com и обнаружил следующее:

Дайте этот код

function katana () {
this.myvar = true;
}
katana ();
console.info (myvar);

В тот момент, когда я компилировал код, я думал, что myvar присоединен к функции катана. На самом деле, он привязывается к объектам окна, что загрязняет глобальное пространство имен.

Я вернулся к своим проектам, которые используют один и тот же подход ... немного по-другому

function katana () {
this.myvar = true;
}
var xyz = new katana();
console.info (myvar);

У меня есть объект функции, и вместо того, чтобы выполнить функцию, я просто создаю ее новый экземпляр (на самом деле я не совсем уверен, что происходит). Затем я использую xyz для хранения значений и использую эти значения с помощью прототипов для выполнения некоторых работ.

Что меня удивило, так это то, что когда я провел некоторую отладку с помощью FireBug, xyz не существует. К объекту окна не привязаны переменные. Почему?

Я сделал еще одну отладку, и объект xyz прикреплен к объекту window>, но в DOM это не очевидно и не имеет следов. В окне отладки также есть что-то новое, узел под названием 'scopechain' с вызовом, который имеет значения объекта xyz.

Хорошо, что происходит под ним? Это хороший метод, который я должен придерживаться, или я должен искать альтернативу? Я посмотрел на некоторые вопросы и ответы, в основном я ищу, что этот метод делает в фоновом режиме.

1 Ответ

3 голосов
/ 04 августа 2010

Когда вы говорите new katana(), Javascript вызывает функцию katana с новым пустым объектом как this. Как только он возвращается, предположительно инициализированный, новый объект (или все, что katana возвращает, пока он является объектом) устанавливается так, чтобы его «прототип» (объект, от которого он унаследует поля и тому подобное), был таким же как прототип функции katana.

Да, это тоже не имело особого смысла, когда я впервые прошел через это. Упрощенная версия, скажем, new katana(), и Javascript создает экземпляр katana и позволяет функции katana его инициализировать. Вы говорите katana(), а this - это последний объект в стеке вызовов, который был использован при вызове метода экземпляра. (Если ваш абонент был x.foo, this == x.) Если такого объекта нет, кажется, this совпадает с window.

Что касается того, почему xyz не отображается, вы объявили переменную с var. Это меняет сферу. Если бы вы избавились от этого, вы бы увидели window.xyz.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...