Почему ссылка на необъявленную переменную «имя» возвращает «результат» в JSFiddle? - PullRequest
1 голос
/ 03 февраля 2020

jsfiddle

, имя переменной никогда не было объявлено. Значение возвращается в виде строки «result». Разве это не неправильно, не должно ли оно быть «неопределенным»?


let obj = {
name: name,
age: "23"
}

alert(obj.name);

или

obj = {
name,
age: "23"
}

alert(obj.name);

Ответы [ 2 ]

4 голосов
/ 03 февраля 2020

Это потому, что JSFiddle вручную вставляет следующий скрипт в каждый iframe:

// tell the embed parent frame the height of the content
if (window.parent && window.parent.parent){
  window.parent.parent.postMessage(["resultsFrame", {
    height: document.body.getBoundingClientRect().height,
    slug: "n4j20xkh"
  }], "*")
}

// always overwrite window.name, in case users try to set it manually
window.name = "result"

Это можно увидеть, проверив результат iframe и посмотрев тег <script> в нижняя часть тела. Поэтому, даже если ваш код никогда не создает переменную name, он уже существует в глобальной области видимости.

enter image description here

Обратите внимание, что window.name будет всегда существовать в виде строки независимо от сайта, даже если сайт ему не назначен.

(Обычно ссылается на неинициализированную переменную приведет к ошибке ReferenceError - , а не undefined - но поскольку существует window.name, ошибки не выдается.)

4 голосов
/ 03 февраля 2020

Вы просто добавляете window.name (name, определенный в глобальной области видимости) к obj.name:

let obj = {
name: name,
age: "23"
}

console.log(window.name);
console.log(obj.name);
...