Javascript 如果我将变量“closed”全局定义为“0”,为什么会将其记录为“false”?

Javascript 如果我将变量“closed”全局定义为“0”,为什么会将其记录为“false”?,javascript,variables,scope,Javascript,Variables,Scope,我知道这一定是非常基本的东西,但我不明白范围是如何工作的。我希望在整个JavaScript文件中都知道closed变量 我有类似的东西(在jQuery中): 但是closed被记录为false。我用load和onload函数尝试了很多东西,但是我失败了。使用let而不是var,因为closed是JavaScript运行时使用的全局变量,因此为了使其位于代码范围的局部,您可以使用let而不是var,后者考虑到globalclosed属性,将变量设置为全局范围 let closed=0; $(函数

我知道这一定是非常基本的东西,但我不明白范围是如何工作的。我希望在整个JavaScript文件中都知道
closed
变量

我有类似的东西(在jQuery中):


但是
closed
被记录为
false
。我用
load
onload
函数尝试了很多东西,但是我失败了。

使用
let
而不是
var
,因为
closed
是JavaScript运行时使用的全局变量,因此为了使其位于代码范围的局部,您可以使用
let
而不是
var
,后者考虑到global
closed
属性,将变量设置为全局范围

let closed=0;
$(函数(){
控制台日志(关闭);
});

var closed=0不会创建数字,而是保持布尔值
false


原因是在这种情况下,
closed
指的是;它总是一个布尔值,重新定义它会产生一个类似“重新定义
关闭的
”这样的警告

只读属性指示引用的窗口是否关闭


可以在以下列表中找到行为类似的变量:

运行代码段以获取无法在全局范围内安全使用的变量名的完整列表:

const props=Object.entries(Object.getOwnPropertyDescriptors(窗口)),
不良={
设置:(desc)=>desc,
可配置:(desc)=>!desc,
可写:(desc)=>!desc
};
Array.from(document.querySelectorAll(“[id]”)
.forEach((span)=>span.innerHTML=props
.filter(([prop,{[span.id]:desc}])=>不需要的[span.id](desc))
.map(([prop])=>`
${prop}
`) .join(“,”)
code{
背景:#eee;
填充物:1px 3px;
}
具有setter的属性,当为其设置值时,setter可能会更改类型或调用某些操作:


不可配置的属性:


只读属性:


closed
指全局范围内的
窗口。closed
。不要全局定义变量。如果必须,请将所有内容都封装在一个生命中。它看起来像一个生命,外部变量无法访问它。这正是我所需要的。谢谢。@MinirockAkeru这个答案没有解释为什么会得到
false
。并不是所有变量都是这样的。在大多数情况下,这甚至不起作用。它适用于
关闭的
,但不适用于
顶部
,即使它们都是
窗口
上的不可写、可配置、可枚举、非setter getter。我目前不明白(至少)为什么
窗口
,当在全局范围中使用
const
let
时,
top
document
的行为与所有其他属性不同。也许我或其他人可以弄明白这一点,并完善这个答案中给出的解释。
var closed = 0;

$(function(){
  console.log(closed);
});