为什么在 JSFiddle 中引用未声明的变量 "name" return "result"?
Why does referencing the non-declared variable "name" return "result" in JSFiddle?
在下文中,从未声明过变量名。该值作为字符串 "result" 返回。是不是写错了,不应该是"undefined"吗?
let obj = {
name: name,
age: "23"
}
alert(obj.name);
或
obj = {
name,
age: "23"
}
alert(obj.name);
您只是将 window.name
(name
在全局范围内定义)分配给 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
存在,因此不会抛出任何错误.)
在下文中,从未声明过变量名。该值作为字符串 "result" 返回。是不是写错了,不应该是"undefined"吗?
let obj = {
name: name,
age: "23"
}
alert(obj.name);
或
obj = {
name,
age: "23"
}
alert(obj.name);
您只是将 window.name
(name
在全局范围内定义)分配给 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
存在,因此不会抛出任何错误.)