JavaScript новое ключевое слово и области объектов


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

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

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

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

Я вернулся к своим проектам, которые все используют один и тот же подход.. немного по-другому
function katana () {
this.myvar = true;
}
var xyz = new katana();
console.info (myvar);

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

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

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

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

1 ответ:

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

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

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