Когда я запускаю следующую простую строку Javascript … консоль регистрирует ошибку.

console.log(abc); 

Но когда я запускаю вышеуказанную строку, как

 console.log(this.abc); or console.log(window.abc); 

консоль не выдает ошибку. Вместо этого он печатает «неопределенный». Почему? Примечание. Переменная ‘abc’ не определена и не объявлена.

Ссылка на несуществующее свойство не ошибочна, но ошибочно ссылаться на отдельное имя переменной, которая не существует.

Когда кто-то ссылается на несуществующее свойство объекта, возвращается undefined — так все и происходит. Но автономные имена переменных, с другой стороны, должны определяться перед обращением к ним почти во всех ситуациях. Если не определить автономную переменную, прежде чем пытаться ссылаться на нее, возникнет ошибка ReferenceError во всех ситуациях, кроме 2:

(1) При использовании typeof

(2) При присвоении такой переменной в нестрогом режиме (переменная будет неявно создана для глобального объекта):

 const arr = [1, 2, 3]; for (i = 0; i {amp}lt; arr.length; i  ) { // if in sloppy mode, and i hasn't been defined beforehand, // it will be created as a global variable } console.log(typeof i); 

Если вы попытаетесь присвоить такую ​​переменную в строгом режиме, если она не была объявлена ​​заранее, будет выдано сообщение об ошибке.

Когда вы ищете переменную

 console.log(abc); 

Не определяется и должен бросить

Uncaught ReferenceError: abc

не определен ни в каком контексте вообще

тем не мение

 console.log(this.abc) and console.log(window.abc) 

часть его определена

 console.log(this) console.log(window) 

возвращают текущие объекты экземпляра и объекты окна соответственно и имеют контрольную точку. обычный console.log (abc) не имеет контрольной точки

на самом деле это не переменная. Это ключ, который находится внутри объекта. (На данный момент объект this или window ). это и окно создано из JavaScript.

dizefurkan

новый участник этого сайта. Будьте внимательны, спрашивая разъяснения, комментируя и отвечая. Проверьте наш

Правила поведения

,

Это интересный вопрос! Чтобы понять это, мы должны понимать Переменное Подъем в Jaascript .

если вы хотите undefined для переменной, которая еще не объявлена, хорошо бы сработало следующее!

 console.log(abc) var abc = 'ss'; 

Итак, здесь, если мы попытаемся получить доступ к объявленной переменной до ее инициализации, тогда undefined фактически назначается на вершине выполнения функции. другими словами, все переменные поднимаются на вершину их непосредственного уровня области и назначаются undefined пока они не достигнут точки инициализации.

чтобы дать вам тупой ответ, попытка использовать необъявленную переменную выдаст вам Reference Error при попытке получить доступ к объявленной переменной до того, как инициализация даст вам undefined

и, для таких объектов, как this и хорошо, они являются доступными объектами. так что в основном в этот момент люди говорят: In Javascript everything is present , то есть попытка получить доступ к свойству, которого еще нет в объекте js, даст вам undefined .

В большинстве браузеров и сред Javascript, которые соответствуют спецификации Javascript (это может измениться в других средах javascript, где нет консоли):

Любое свойство, которому не было присвоено значение или несуществующее свойство (или функция без оператора return), возвращает undefined .

В первых примерах вызывается оператор точки. Поведение в случае, если вы обращаетесь к несуществующему свойству, определено, и это то, что возвращает undefined , который является допустимым типом js. Поэтому undefined регистрируется.

В последнем примере, с другой стороны, несуществующая переменная генерирует ReferenceError. Это происходит напрямую, поскольку в отличие от первого случая, контекст не был доступен, оператор точки не вызывается, и это просто ошибка.

Это нормальное поведение JavaScript.

Давайте рассмотрим name переменной

 var name; console.log(name); 

Вышеуказанное не выдаст ошибку, потому что name переменной было объявлено до ее использования в console.log .

 console.log(name); 

Это вызовет ошибку ссылки, потому что вы не объявили переменную первой.

Но,

Если к имени обращаются из уже определенной переменной (например, окна, this), оно не выдаст ошибку, независимо от того, определена она или нет. Так же, как ниже будет просто печатать неопределенное, ошибка ссылки не будет выдана.

 console.log(window.name); 

Обратите внимание, что окно уже определено браузером.

Несмотря на это,

 console.log(window_a.name); 

вышеупомянутый вызовет ошибку ссылки, потому что к name обращаются по неопределенной переменной window_a .

 var window_a = {}; console.log(window_a.name); 

Это не window_a ошибке ссылки, потому что теперь объявлено window_a .