В этой статье описываются предварительные и связанные с ними методы JavaScript. Поделитесь этим для вашей ссылки, следующим образом:
переменная
Опять же, начните с подсказок сравнения ошибок этих двух небольших примеров.
блюд (Y1); // Сегмент кода 1var y1 = 'dddd'; alert (y2); // Сегмент кода 2 // оповещение (Typeof Y2); y2 = 'xxxxx';
Давайте сначала подумаем о том, почему один подсказывает неопределенную, а другой бросает ошибку неопределенных переменных. Полем Давайте сначала посмотрим на процесс анализа JavaScript.
Перед процессом выполнения JavaScript сделает событие «Preparsement». Двигатель разбора выполняет создание всех переменных VAR на уровне блока и дает им начальное значение: не определен. Таким образом, причина, по которой первый пример появляется неопределенным, очевидна.
Таким образом, первый код на самом деле эквивалентен на
var y1; оповещение (тип y1); // Естественно, его значение не определено1 = 'dddd';
Почему второй кусок кода снова бросил неправильно? Он больше не принадлежит к стадии «предварительной перемещения» (здесь я предполагаю, что браузер делает только две вещи при столкновении с тегом скрипта: предварительно переносится и исполнение, что на самом деле не только эти две вещи). Тем не менее, на этапе выполнения причина бросания ошибки заключается в том, что JS не знает состояния Y2 в состоянии сегмента выполнения (никакая информация о Y2 не была получена на стадии предварительного процесса), и, конечно, она бросает неопределенную информацию об ошибках. Здесь возникает другая проблема: JS-это язык слабого типа, и переменные могут использоваться без определения, так почему его чередовано в качестве ошибки определения?
Всегда есть причина, чтобы что -то случилось. У JavaScript всегда есть много странных функций, и есть переменная, которая читается и пишет неравномерность. Неопределенные переменные только для записи и не читаются. Что можно написать? Все знакомы с этим методом написания:
y2 = 'экзамен'; // До появления операции определения (т.е. до того, как у нее нет собственной области), эта операция рассмотрит этот код для определения глобальной переменной, зарегистрировать свойство Y2 в окне и назначить его экзамену
Но при чтении его двигатель JS не может найти никакой связанной информации о нем, поэтому он действует со своим собственным характером и делает неопределенную ошибку без колебаний. Это правило игры JS. И все же, почему вы можете получить его тип? Помните операции JS на объектах. Если вы получите доступ к объекту, которого не существует, он будет предложить неопределенным (потому что он в настоящее время является атрибутом объекта Window).
ПРИМЕЧАНИЕ. Здесь необходимо отличить, что чтение и записи неровные переменные используются только для переменных, и все свойства объектов считываются. Этой функции не существует. Если его не существует, это будет предложить не определенным.
в заключение
На данный момент мои мысли приводят к результату: в операциях по написанию переменных и объектов есть определенные сходства. Тем не менее, у каждого есть свой собственный набор правил для чтения. Из -за этого возникают вышеупомянутые проблемы.
Таким образом, на следующий вопрос следует легко ответить.
if (! ('a' in window)) {var a = 1;} alert (a);функция
Чтобы расширить это, функционировать. Помните предварительное начало, упомянутое выше. В предварительном процессе JavaScript, в дополнение к предварительно определению переменных VAR, он также включает извлечение определения функции, поэтому функцию можно определить в любом месте сценария и вызвать где угодно. Не ограничивается до этого.
Однако метод определения функции включает в себя метод буквального определения с использованием метода VAR для объявления функции. См. ниже
оповещение (TypeOf Y3); // Результат? Var y3 = function () {console.log ('1'); }Помните это Соглашение: вызов должен появиться после объявления. Почему? Если вы понимаете вышеперечисленное, ответ здесь на самом деле ясен. При предварительном перебоке VAR, двигатель JavaScript даст им начальное значение неопределенным. Таким образом, если мы позвоним в его объявлении, двигатель JavaScript еще не получил своего истинного значения, он, естественно, сообщит об ошибке «XXX не является функцией». Это также разъясняет, почему обе декларации функции связаны с порядком объявлений и вызовов, а у другого нет таких ограничений.
в заключение
Это функция, результат выполнения JS и динамической модификации, и она по-прежнему следует правилам предварительного анализа переменных (при предупреждении выше она не получила информацию о буквальной функции).
Что если это смесь из двух. Посмотрите на следующее, есть как переменные, так и функции для Y4.
оповещение (TypeOf Y4); // Результат? Функция y4 () {console.log ('y4')} var y4;Поскольку JavaScript имеет высокий приоритет в предварительном процессе, Y4, естественно, является типом функции, но после назначения Y4 (двигатель JS находится в процессе выполнения), его операция назначения JS будет переопределить объявление функции. так:
Alert (typeof y5); var y5 = 'angle'; function y5 () {console.log ('Ghost'); } оповещение (y5);Первым результатом оповещения является функция, потому что он находится на вершине процесса выполнения JS. Во второй раз, когда переименовано в предупреждение, его значение было переписано в 5 (не путайте положением определения функции ниже.)
Подумав об анализе и исполнении JS, я понял, что внезапно понял, что ответы на многие вопросы естественным образом появились. Как сказал автор этой статьи: «Как только вы поймете концепции среды исполнения, вызывают объекты, закрытие, лексическое область и цепочки объема, многие явления на языке JS могут быть легко решены».
Оглядываясь назад, даже на этом невероятном языке, есть много причин, по которым можно проследить.
Как сделать лучшие суждения о параметрах
После обсуждения так много выше, как это может быть ближе к фактическому развитию? Поскольку JavaScript читает и пишут неравномерность, как мы можем избежать вынесения суждений параметров без ошибок?
например:
if (cusvar) {// Суждение здесь является неявной проблемой. }Как быть более строгим.
if (window ['cusvar']) {// Убедитесь, что оно не сообщает об ошибке. // или такое суждение также является возможным window.cusvar | Typeof Cusvar! == 'Undefined' // Работа}Наконец, добавлена еще одна небольшая викторина (понимайте разделение предварительного переписки и исполнения)
var y7 = 'test'; function fun1 () {alert (y7); var y7 = 'sex';} fun1 ();For more information about JavaScript related content, please check out the topics of this site: "Summary of JavaScript switching effects and techniques", "Summary of JavaScript search algorithm skills", "Summary of JavaScript animation effects and techniques", "Summary of JavaScript errors and debugging techniques", "Summary of JavaScript data structures and algorithm skills", "Summary of Алгоритмы и методы обхода JavaScript »и« Сводка использования математических операций JavaScript ».
Я надеюсь, что эта статья будет полезна для каждого программирования JavaScript.