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.