Функция JavaScript и Конфликт имен Формы

Я поместил все кроме JDK и IDE в управлении исходным кодом.

философия Tony является звуковой. Не забывайте сценарии создания базы данных и сценарии обновления структуры данных. Прежде чем wikis вышел, я раньше даже хранил нашу документацию в управлении исходным кодом.

7
задан mavrosxristoforos 5 July 2016 в 10:23
поделиться

2 ответа

Чтобы добавить некоторые детали к тому, что здесь происходит, вам необходимо понять цепочку областей видимости javascript.

Объект области

Объект области видимости - это скрытый объект создается, когда выполняется функция, для которой переменные, объявленные с помощью var , помещаются как свойства, а также любая именованная функция внутри выполняемой функции также помещается как свойства в объект области.

Когда запрашивается такой идентификатор, как mytest , javascript выполняет поиск этого имени, прикрепленного к текущему объекту области (кстати, объект области также известен как «контекст выполнения»).

Scope Chain

Когда функция объявляется внутри функции, текущий объект области видимости присоединяется к функции. Когда эта внутренняя функция выполняется (и, следовательно, имеет свой собственный объект области), выполняемый код имеет доступ не только к текущему объекту области, но также и к объекту области, в котором была создана выполняемая в данный момент функция. Остановитесь здесь, перечитайте последнее предложение. Это известно как цепочка областей видимости , цепочка будет такой же глубокой, как и функции внутри функций (это часто случается при использовании таких фреймворков, как JQuery).

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

Странность атрибута события

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

Так, например, измените код onclick в вашем примере на «alert (href)». Вы увидите путь к своей странице, за которым следует # в окне предупреждения.

7
ответ дан 6 December 2019 в 19:39
поделиться

Функция является членом объекта window , а форма - членом коллекции forms в документе ] объект. Когда сценарий ищет совпадение для идентификатора «mytest», он сначала просматривает объект document , а если его там нет, он просматривает объект window .

Вы можете получить доступ к функции даже с конфликтующим именем формы, если укажете, что она находится в окне объект:

<a href="#" onClick="window.mytest();">Click Me</a>
6
ответ дан 6 December 2019 в 19:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: