Упомянутый здесь JavaScript относится к среде браузера, включая среду хоста. Первый — это глобальный объект ECMAScript, а второй — глобальный объект/функция в среде хоста (хост).
1. Базовые встроенные объекты JavaScript, то есть объекты, предоставляемые реализацией ECMAScript, которые не зависят от среды хоста.
Эти объекты уже существуют (созданы) до выполнения программы. ECMAScript называется глобальным объектом и делится на следующие типы.
1. Свойства значения глобального объекта. Есть NaN, Infinity, undefinity.
2. Функциональные свойства глобального объекта. Есть eval, parseInt, parseFloat, isNaN, isFinite, decodeURI, encodedURI, encodeURIComponent.
3. Свойства конструктора глобального объекта (Свойства конструктора глобального объекта). Существуют объект, функция, массив, строка, логическое значение, число, дата, RegExp, ошибка, EvalError, RangeError, ReferenceError, SyntaxError, TypeError, URIError.
4. Другие свойства глобального объекта можно рассматривать как статические классы в Java и использовать напрямую с именем класса + точкой + именем метода. Есть Math, JSON.
В спецификации ECMAScript упоминается, что эти глобальные объекты (The Global Object) имеют свойства Writable, то есть Writable имеет значение true, а enumerable (Enumerable) — false, то есть in enumeration не может использоваться. В ECMAScript есть этот раздел
Если не указано иное, стандартные встроенные свойства глобального объекта имеют атрибуты {[[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: true}.
Хоть в спецификации и упоминается, что The Global Object можно переписать, переписывать их никто не будет. Это всего лишь тест.
Скопируйте код кода следующим образом:
НЭН = 11;
оценка = 22;
Объект = 33;
Математика = 44;
предупреждение (НаН);
оповещение (оценка);
оповещение (Объект);
предупреждение(Математика);<BR>
Глобальным объектом атрибута значения, глобальным объектом атрибута функции, глобальным объектом атрибута конструктора (класса) и глобальным объектом других атрибутов являются NaN, eval, Object и Math. Результаты следующие:
Результаты показывают, что за исключением NaN, который невозможно переписать в IE9 (pre3)/Safari, все остальное было переписано. Здесь перечислены только четыре. Если вам интересно, вы можете протестировать все вышеперечисленные глобальные объекты один за другим. Дело в том, что основные встроенные объекты JavaScript обычно можно переопределить, хотя никто этого не делает.
Давайте проверим его перечислимость
Скопируйте код кода следующим образом:
for(var a в NaN){
предупреждение(а);
}
for(var a in eval){
предупреждение(а);
}
for(var a in Object){
предупреждение(а);
}
for(var a в математике){
предупреждение(а);
}
Во всех браузерах всплывающее окно отсутствует, т. е. свойства не перечисляются. Если вам интересно, вы можете проверить свойства перечисления всех вышеперечисленных глобальных объектов один за другим. Конечно, в некоторых браузерах, таких как Firefox, некоторые глобальные объекты можно перечислить после перезаписи.
2. Глобальные объекты/функции, предоставляемые хост-средой.
Такие как окно, оповещение, setTimeout, документ, местоположение и т. д., большинство браузеров ограничивают их перезапись.
Скопируйте код кода следующим образом:
окно = 55;
оповещение (окно);
Это предложение вызовет ошибку в IE, что приведет к незаконному копированию, и последующее всплывающее окно не будет выполнено. Другие браузеры по-прежнему отображают всплывающее окно, если window=55 не существует.
Переписать оповещение еще раз
Скопируйте код кода следующим образом:
оповещение = 55;
console.log(оповещение);
Сообщается об ошибке в IE. Firefox/Chrome/Safari/Opera был переписан. Вы можете увидеть вывод 55 из соответствующей консоли. Видно, что некоторые браузеры не поддерживают перезапись глобальных объектов/функций, предоставляемых средой хоста, а другие могут.
Ниже приведены два способа объявления глобальных переменных.
Скопируйте код кода следующим образом:
а1 = 11;
вар а2 = 22;
for(a в окне){
if(a=='a1'||a=='a2'){
предупреждение(а)
}
}
Приведенный выше код не будет отображать информационное окно в IE. В IE внутреннее содержимое выглядит следующим образом:
Скопируйте код кода следующим образом:
//IE
с(host_object){//окно
with(global_object){//Глобальный
а1 = 11;
вар а2 = 22;
}
}
То есть a1 и a2 — это атрибуты объекта Global, предоставляемые механизмом JS в качестве первого типа, упомянутого выше, а не атрибуты объекта окна, предоставляемого второй средой размещения. Следовательно, a1 и a2 не существуют в окне IE. Если IE предоставляет ссылку на объект Global, возможно, следующий код может открыть информационное окно.
Скопируйте код кода следующим образом:
for(a в глобальном масштабе){
if(a=='a1'||a=='a2'){
предупреждение(а)
}
}
Внутренняя часть Firefox/Safari/Chrome/Opera, вероятно, выглядит следующим образом.
Скопируйте код кода следующим образом:
//Firefox/Safari/Chrome/Opera
с(host_object){//окно
а1 = 11;
вар а2 = 22;
with(global_object){//Глобальный
}
}
То есть a1 и a2 — это второй тип, упомянутый выше, атрибуты в окне глобального объекта, предоставляемые средой хоста. Следовательно, в окне in существуют как a1, так и a2, и появляется информационное окно.
Давайте посмотрим на сторонний метод объявления глобальной переменной window.a3 = 33. Это показывает, что a3 вешается на окно как свойство окна, поэтому a3 можно получить во всех браузерах, когда for in window.