为什么在 JSFiddle 中引用未声明的变量 "name" return "result"?

Why does referencing the non-declared variable "name" return "result" in JSFiddle?

jsfiddle

在下文中,从未声明过变量名。该值作为字符串 "result" 返回。是不是写错了,不应该是"undefined"吗?


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

alert(obj.name);

obj = {
name,
age: "23"
}

alert(obj.name);

您只是将 window.namename 在全局范围内定义)分配给 obj.name:

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

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

这是因为 JSFiddle 手动将以下脚本注入 every 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 变量,它也已经存在于全局范围内。

请注意,window.name will always exist 作为字符串,与站点无关,即使站点未分配给它也是如此。

(通常,引用未初始化的变量会导致 ReferenceError - not undefined - 但由于 window.name 存在,因此不会抛出任何错误.)