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 ответ:
Когда вы говорите
Да, это тоже не имело особого смысла, когда я проходил через это в первый раз. Чрезмерно упрощенная версия, вы говоритеnew katana()
, Javascript вызывает функциюkatana
с новым пустым объектом в видеthis
. После того, как он возвращает, предположительно инициализированный, новый объект (или любой другой объектkatana
, если это объект) настраивается таким образом, что его "прототип" (объект, от которого он унаследует поля и т. д.) совпадает с прототипом функцииkatana
.new katana()
, и Javascript создает экземплярkatana
и позволяет функцииkatana
инициализировать его. Вы говоритеkatana()
, иthis
является в основном последним объектом в стеке вызовов, который был использован в вызове метода экземпляра. (Если ваш абонент былx.foo
,this == x
.) Если такого объекта нет, тоthis
кажется таким же, какwindow
.Что касается того, почему
xyz
не появляется, Вы объявили переменную сvar
. Это меняет сферу применения. Если вы избавитесь от этого, вы увидитеwindow.xyz
.