如果我将变量“close”全局定义为“0”,为什么它会被记录为“false”?

2023-11-22

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

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

var closed = 0;

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

But closed正在被记录为false。我尝试了很多事情load and onload功能,但我失败了。


问题:全局只读属性

首先,请注意这个问题存在于Web环境中,即浏览器中。 其他JS环境可能没有这个问题。

var closed = 0;在全局范围内不会创建引用数字的绑定,并且仍然是布尔值false.

这样做的原因是closed指的是window.closed在这种情况下;它始终是一个布尔值,重新定义它会产生一个 linter 警告,例如“重新定义closed.

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

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

  • Window特性
  • WorkerGlobalScope特性

MDN 上也曾经有过关于 mixin 的文档,名为WindowOrWorkerGlobalScope,其属性适合此列表;然而,这仅指的是两者都存在的事物Window and in WorkerGlobalScope。 一小段上下文:MDN 对其文档进行了重构,删除了所有这些“混合”以支持标准接口名称。 你可以找到此列表的存档版本.

Window or WorkerGlobalScope其中两个接口globalThis可以是 Web 环境中的实例。

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

const props = Object.entries(Object.getOwnPropertyDescriptors(globalThis)),
  undesirable = {
    set: (desc) => desc,
    configurable: (desc) => !desc,
    writable: (desc) => !desc
  };

Array.from(document.querySelectorAll("[id]"))
  .forEach((span) => span.innerHTML = props
    .filter(([prop, {[span.id]: desc}]) => undesirable[span.id](desc))
    .map(([prop]) => `<code>${prop}</code>`)
    .join(", "))
code{
  background: #eee;
  padding: 1px 3px;
}
<p>Properties that have a setter which may change the type or invoke some function, when a value is set to it:</p>
<span id="set"></span>

<hr/>

<p>Properties that are not configurable:</p>
<span id="configurable"></span>

<hr/>

<p>Properties that are read-only:</p>
<span id="writable"></span>

你会注意到,这是一个lot。 还有很多简短的常见变量名,例如name, length [1], [2], status [1], [2], self, top, menubar, and parent。 此外,关于在分配给 setter 时调用某些函数,例如var location = "Podunk, USA";实际上重定向你到那个地点./Podunk, USA.

使用函数名称存在一个相关问题,例如lang, checked, autocomplete, evaluate, or animate在事件属性中,例如onclick: 不仅有window属性包含在作用域链中,但也包含所有scopable当前整个原型链的属性HTMLDocument以及目前的具体Element(例如使用<a onclick=""></a>提供对所有内容的访问HTMLAnchorElement.prototype)也许还有更多,例如任何来自form(表单元素的)属性(如果存在)。

这一切也都在这篇文章中得到了解释回答相关问题.

当依赖时也会出现这个问题DOM 节点带有id成为全球地产.

解决方案

对此有一些解决方案。 我将按照从最好到最差的主观顺序列出它们。

使用模块代替

将您的 JavaScript 代码运行为modules代替脚本不仅是新的很酷的事情,而且只是没有这个问题.

index.html:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8">
    <title>Your site</site>
    <script type="module" src="main.mjs"></script>
  </head>
  <body>
    <!-- Content. -->
  </body>
</html>

main.mjs:

const top = { spinning: true },
  window = { type: "clear", frame: "wood" };
let document = { type: "LaTeX", content: "\\documentclass[a4]{…} …" },
  closed = 0;
var location = "Podunk, USA";

// All of these are the variables defined above!
console.log({ top, window, document, closed, location });

模块还带有一些其他有用的功能,例如隐式延期和---关联DOM解析.

将一切包裹在新的范围内

在脚本的全局作用域中,您会遇到这个问题。 在新的函数作用域中,您不会遇到此问题:

(function(){
  const closed = 0; // Or `let` or `var`.
  
  $(function(){
    console.log(closed);
  });
})();

您还可以创建更有用的范围,例如 jQuery 的$(function(){});它等待 DOM 被加载。This顺便说一句,可能是兼容性最高的选项,同时仍然是更好的选项之一。

因为我不使用 jQuery,所以我更喜欢将所有内容包装在DOMContentLoaded侦听器,我可以在其中确定我需要的所有变量的范围,此外,还可以使用"use strict";:

addEventListener("DOMContentLoaded", () => { "use strict";
  // Code goes here.
});

这避免了全局属性和全局变量之间的冲突。

总是使用const。如果您无法使用const, use let。如果您无法使用let, use var.

… But you’ll never need var!1

Using const or let在脚本中,如安基特·阿加瓦尔的回答建议,缓解这个问题:

const closed = 0;

console.log(closed); // 0

然而,这仅适用于most变量名,但不是全部 —const closed = 123; let history = "Hello, world!";所有工作,但是const window = 123;, const top = 123; or let document; don’t.

1: Although there may be one edge-case. And obviously, older browsers still need var.

只需使用不同的变量名称

听起来很明显,但这并不是很稳健。

新的全局属性可能总是会弹出,因此全局变量可能随时与它们发生冲突。 由于这显然会破坏整个互联网上的多个脚本,因此现在添加的全局属性实际上并不会产生太大的问题。const history = "Regency Era";工作得很好并且使history可用作引用该字符串的变量。var history =;仍然没有,并且它会抛出一个错误严格模式,并且在松散模式下默默地失败。这在历史上导致了兼容性问题这是why这不是一个强大的选项,尤其是在使用时var,这又是反对的另一个有力论据var.

重新分配older属性,例如document,将会失败scripts,在某些环境下,但是每个变量名都可以在module,在每种环境中,这就是为什么这是最推荐的选项。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如果我将变量“close”全局定义为“0”,为什么它会被记录为“false”? 的相关文章

  • 自动调整Google网站嵌入代码的高度(html)

    我正在使用 Google 协作平台嵌入 HTML 代码 将代码粘贴到 从网络嵌入 窗口中 输出的长度是可变的 我希望有一种方法可以动态调整父级的高度iframeGoogle 协作平台用于托管我的 HTML 我知道我可以使用 Google 协
  • 滚动时输入自动完成位置错误(chrome)

    我在输入文本的默认自动完成功能方面遇到了一些麻烦 滚动时它不会相应移动 我希望自动完成文本保留在输入的正下方 有办法做到这一点吗 我在 Chrome 浏览器版本 57 0 2987 133 中发生这种情况 fiddle https jsfi
  • 定义 js-xlsx 单元格范围

    我正在尝试使用 js xlsx 读取 Excel 值 我可以使用以下代码从工作簿工作表中获取单元格值 if typeof require undefined XLSX require xlsx var workbook XLSX readF
  • 第一次使用node.js - “ReferenceError:节点未定义”

    我刚刚安装了node js 我尝试编写应该检查版本的node v 但它不起作用 这是输出 gt node v ReferenceError node is not defined at repl 1 2 at REPLServer self
  • html 表格单元格的条件格式

    是否有现成的解决方案可以对 HTML 表格进行条件格式设置 通过条件格式 我更感兴趣的是根据该列或其他列 在同一个表中 的值 数字 将不同的颜色作为单元格背景 类似于我们在 Excel 条件格式 gt 色阶 gt 红黄绿中的内容 我想在通过
  • 限制可选 DOM 复选框

    我试图限制用户可以选择的复选框数量 这些复选框是为数组中的每个项目生成的 DOM 输入对象 我目前对此没有运气 因此非常感谢任何帮助 谢谢 在这里小提琴 http jsfiddle net vVxM2 222 http jsfiddle n
  • 在鼠标光标位置添加 cytoscape 节点

    我想在画布上的单击事件上的鼠标箭头位置添加一个 cytoscape 节点 我怎样才能做到这一点 我的方法 效果不太好 我可以通过单击创建一个节点 但无法确保创建的节点的位置位于我单击的位置 使用这样的东西 cy click function
  • 以一定时间间隔连续重复运行 JavaScript 函数

    这是我的第一个问题 希望您尽快回答 我想要代码连续重复一个函数 我尝试了一些代码 但没有成功 我尝试了这段代码 我想在一段时间后重复这个功能 我努力了setInterval and setTimeout 但是 我还没有收到结果 这将重复该任
  • Web 组件 - 服务/非 html 组件

    所以我来自 Angular 想看看如何创建vanilla Web components 现在 从 Angular 开始 我们倾向于将事物分开 组件 充当 HTML CSS 和一些 javascript 然后是 服务 主要负责收集数据和执行不
  • 为什么 length 是 `Array` 的属性而不是 `Array.prototype` 链

    所以我在 V8 控制台上玩了很多 我做到了 Object getOwnPropertyNames 我期望得到 结果 然而 length 所以这意味着不是成为原型链的一部分 length是所有人的成员财产Array对象 这是一个错误 还是有任
  • 启用/禁用由用户输入确定的复选框

    我有一个简单的表单 用户可以在其中输入他的联系号码 如果联系号码以 07 开头 则该复选框已启用 其他我需要禁用它的复选框 我已经编写了一些代码 但我面临的问题是 当用户键入 01 时 它会被禁用 但如果他们继续在 01 之后添加任何其他数
  • javascript jquery 使用脚本更改脚本的src

    我有一个 JavaScript 脚本 它有一个 src 元素 这个 src 是一个 url 我想使用 javascript 更改它 一次更改为其他内容 或者动态创建它 使用 javascript jquery 动态创建脚本元素的最佳方法是什
  • 在 jQuery 可排序中对多个选定项目进行排序?

    我试图在 jQuery 可排序集中选择多个项目 然后将选定的项目一起移动 这是我的弱点开始尝试使其发挥作用 http jsfiddle net benstenson CgD8Y 这是代码 HTML div class container d
  • console.log() 显示同一对象属性的矛盾值

    我想我可能要疯了 我使用 console log 来查看对象的状态 然后在下一行对同一对象的特定属性执行 console log 并为每个属性获取不同的值 我正在使用的代码是 console log this pictures Items
  • 如何使用 vanilla JS 实现可维护的反应式 UI

    今天我遇到了一个问题 可以通过使用像 Vue 这样的反应式和状态管理框架来轻松解决 遗憾的是 无法使用它 以下 简化 情况 链接到代码笔 https codepen io theiaz pen BazErKV 我们有一个服务器渲染的页面 其
  • 获取点击的的DOM路径

    HTML div class lol a class rightArrow href a div 伪代码 rightArrow click function rightArrowParents this dom dom is the pse
  • Node.js 未处理的“错误”事件

    我编写了一个简单的代码并将其保存在文件 try js 中 var http require http var makeRequest function message var options host localhost port 8080
  • 从 DirectionsRenderer 中获取折线或标记的事件

    我正在使用 DirectionsService 和路线方法来生成 DirectionsResult 我还使用 DirectionsRenderer 对象来显示结果 因为它非常易于使用 我在检测 Directions changed 事件时没
  • Knockout.js 安全绑定

    我想使用带有淘汰赛的安全绑定 为此我使用敲除安全绑定 js https github com brianmhunt knockout secure binding 谁能解释一下为什么下面的代码不起作用 它会抛出一个错误 未捕获 淘汰 安全
  • MongoDB中如何通过引用字段进行查询?

    我有两个 Mongo 模式 User id ObjectId name String country ObjectId Reference to schema Country Country id ObjectId name String

随机推荐

  • 根据文本框的输入动态显示/隐藏div

    我正在一个网站上工作 我有一个页面 其中包含这样构建的人员列表 div class personsMenu div class person div class name John div div class age 18 div div
  • Symfony2 错误:加载的类名和声明的类名之间大小写不匹配:

    我正在 Symfony2 上工作 我更新了我的项目composer phar update 现在 当我检查我的网站时app dev php我总是有这个错误 Case mismatch between loaded and declared
  • 在数组中找到一个对象?

    Swift 有类似的东西吗 findWhere在Underscore js 中 我有一个类型的结构数组T并想检查数组是否包含一个结构对象 其name财产等于Foo 尝试使用find and filter 但它们只适用于原始类型 例如Stri
  • 使用常规迭代器向后迭代,还是与反向迭代器作斗争?

    我最近了解了在 C 中使用反向迭代器的正确方法 特别是当您需要擦除迭代器时 看这个问题 and this one 这就是你应该这样做的方式 typedef std vector
  • 方案中定义表达式的类型

    简单地说 我的问题是Scheme中定义表达式的类型是什么 举个例子 define x 5 or define x lambda n n n 这对我来说有点混乱 有人可以帮忙吗 球拍内define是一种特殊形式而不是表达式 因此它本身没有值
  • 屏幕上的客户端矩形坐标

    如何获取窗口客户区相对于屏幕的坐标 我想过使用GetClientRect and ClientToScreen 另外 在浏览器窗口中是什么ClientRect 仅有矩形HTML其中显示的文档 或者它包括浏览器栏和弹出菜单 这可能会缩小尺寸H
  • Java - 从缓冲读取器(从套接字)读取正在暂停线程

    我有一个线程从缓冲读取器读取字符 从套接字创建 如下所示 inputStream new BufferedReader new InputStreamReader clientSock getInputStream 这段代码只能运行一次 例
  • Clojure 1.9 Windows 安装

    过去 我使用 clojure org 提供的 Windows 安装程序在我的各种 Windows 计算机上安装 clojure Clojure 1 9 已经发布几周了 但据我所知 仍然没有 Windows 安装程序或基于 Java 的通用安
  • 特定扩展名的 Directory.GetFiles

    有没有办法简化这个 linq 表达式 或者有更好的方法吗 Directory GetFiles dir SearchOption AllDirectories Where s gt s EndsWith jpg StringComparis
  • 尝试将图表、范围等插入到 Word 时,Excel 2010 VBA 中的复制/粘贴错误

    在研究这个错误时 我得出的结论是 它与剪贴板没有像应有的那样清除有关 这在我们使用 2003 时不是问题 但现在我们使用 2010 我也继承了这段代码来自不再在这里工作的人 运行时错误 4605 此方法或属性不可用 因为剪贴板为空或无效 这
  • SockJS Python 客户端

    我有一个依赖 Websockets 的网站 Java Spring 践踏 Websocket对于 Spring RabbitMQ SockJS 的某些功能 我们正在创建一个基于 Python 的命令行界面 我们希望添加一些使用 websoc
  • 从 WPF 中的 ViewModel 类(MVVM 模式)更新 UI

    我在我的第一个 WPF 应用程序中使用 MVVM 模式 并且我认为有一些非常基本的问题 当用户点击我的视图上的 保存 按钮时 将执行一个命令 该命令调用我的 ViewModel 中的 private void Save 问题是 Save 中
  • 在 Google Colab 上使用最新的 Python 版本

    Google Colab 安装了 Python 3 6 但它不是当前版本的 Python 我该如何在 Google Colab 上将 Python 升级到最新版本 常见问题解答说 Colaboratory 支持 Python 2 7 和 P
  • 在 Linux 上构建和使用用于 C++ 的纯 llvm 工具链

    假设这是可能的 有人可以告诉我 我如何配置 cmake 构建以在 ubuntu 16 04 上创建一个 纯 llvm 工具链 其中包括 clang lld libc libc abi libunwind llvm 编译器 rt 任何其他可能
  • 避免窗口获得焦点

    我正在使用虚拟键盘 问题是当我按下虚拟键盘上的按键时 需要发送数据的窗口会失去焦点 我怎样才能避免这种情况 当键盘窗体接收焦点时 它接收的部分消息是失去焦点的窗口的句柄 wParam 执行您需要执行的操作 并将焦点设置回失去焦点的窗口 编辑
  • 实数 - 如何确定是否需要 float 或 double?

    给定一个真实值 我们可以检查是否float数据类型足以存储数字 或者double是必须的 我知道精度因架构而异 是否有任何 C C 函数可以确定正确的数据类型 有关背景 请参阅每个计算机科学家都应该了解的浮点运算知识 不幸的是 我认为没有任
  • style,格式化切片运算符

    PEP 8没有提到切片运算符 据我了解 与其他运算符不同 它不应该被空格包围 spam 3 5 OK spam 3 5 NOT OK 当使用复杂的表达式时 这是否成立 即哪种风格被认为更好 1 spam ham 66 3 44 eggs 2
  • 如何实例化不同版本的 InternetExplorerDriver - Selenium 2?

    只是想知道如何实例化不同版本的 InternetExplorerDriver 这就是我创建 IE 驱动程序的方法 WebDriver ieWebDriver new InternetExplorerDriver 但我无法区分 IE6 IE7
  • Java中如何计算整数的尾随零? (例如:234000 => 3 个零)

    标题几乎是不言自明的 1232 gt 0 1231030 gt 1 2000 gt 3 34444400000 gt 5 如果它适合一个int long 只需检查模 10 的数字是否为 0 并保留一个计数器 long x if x 0 re
  • 如果我将变量“close”全局定义为“0”,为什么它会被记录为“false”?

    我知道这一定是非常基本的东西 但我不明白范围是如何工作的 我想要closed变量在整个 JavaScript 文件中都是已知的 我有类似的东西 在 jQuery 中 var closed 0 function console log clo