JavaScript 的“with”语句有合法用途吗?

2023-12-04

艾伦·斯托姆的评论回应我关于with陈述让我思考。我很少找到使用这种特定语言功能的理由,也从未考虑过它可能会带来什么麻烦。现在,我很好奇如何有效地利用with,同时避免其陷阱。

你在哪里找到的with声明有用吗?


今天我想到了另一个用途,所以我兴奋地在网上搜索,发现了一个现有的提及:在块作用域内定义变量.

背景

JavaScript 尽管表面上与 C 和 C++ 相似,但变量的作用域并不限于定义它们的块:

var name = "Joe";
if ( true )
{
   var name = "Jack";
}
// name now contains "Jack"

在循环中声明闭包是一项常见任务,这可能会导致错误:

for (var i=0; i<3; ++i)
{
   var num = i;
   setTimeout(function() { alert(num); }, 10);
}

因为for循环没有引入新的作用域,所以同样num- 值为2- 将由所有三个功能共享。

新范围:let and with

随着let中的声明ES6,在必要时引入新的作用域以避免这些问题变得很容易:

// variables introduced in this statement 
// are scoped to each iteration of the loop
for (let i=0; i<3; ++i)
{
   setTimeout(function() { alert(i); }, 10);
}

Or even:

for (var i=0; i<3; ++i)
{
   // variables introduced in this statement 
   // are scoped to the block containing it.
   let num = i;
   setTimeout(function() { alert(num); }, 10);
}

在 ES6 普遍可用之前,这种使用仍然仅限于最新的浏览器和愿意使用转译器的开发人员。但是,我们可以使用以下方法轻松模拟这种行为with:

for (var i=0; i<3; ++i)
{
   // object members introduced in this statement 
   // are scoped to the block following it.
   with ({num: i})
   {
      setTimeout(function() { alert(num); }, 10);
   }
}

现在,循环按预期工作,创建了三个值从 0 到 2 的独立变量。请注意,声明的变量within与 C++ 中块的行为不同,块的作用域不限于它(在 C 中,变量必须在块的开头声明,因此在某种程度上是相似的)。这种行为实际上非常类似于let块语法在早期版本的 Mozilla 浏览器中引入,但并未在其他地方广泛采用。

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

JavaScript 的“with”语句有合法用途吗? 的相关文章

  • 如何动态地从对象中提取所有元素

    如何从对象中提取特定列 我有一个列数组 我希望从对象中提取这些字段 该对象将由作为项目的映射循环函数构造 现在在这里 如何动态检查我的字段 我不想要这样的 item col 0 请告诉我一个捷径 const person firstName
  • JavaScript 中的 touchstart 不再返回 TouchList

    我遇到了一个非常奇怪的问题 我正在绑定touchstart事件到一个元素 并且想要检索事件的 X 和 Y 坐标 全部文档 http developer apple com library safari documentation apple
  • Google Closure 和生成的 getter/setter

    我正在尝试让 KineticJS 与 Google Closure Compiler 一起使用 然而 KineticJS 根据变量的名称生成它的 getter 和 setter 像这样的事情 add getter and setter me
  • 工厂函数方法不更新变量

    我正在尝试设置一个工厂函数 该函数将更新所述工厂函数中特定变量的值 这看起来实现起来很简单 但是 每当我测试它时 我都会得到变量的原始设置值 而不是更新后的值 我确信在范围界定方面我缺少一些细微差别 但这里到底发生了什么 const fac
  • 如果用户禁用了 javascript,如何回退到完全不同的索引页面?

    我有一个大型 动态生成的单页网站 该网站严重依赖 javascript 我想为没有 javascript 的人提供后备 每个版本必须有不同的 php 代码 所以基本上我需要一个完全不同的索引页面 我不想将所有内容都包装在 javascrip
  • Browserify 与 jQuery >= 2 生成“jQuery 需要一个带有文档的窗口”

    我正在使用 browserify 使用 CommonJS 样式的依赖项来捆绑我的前端 javascript 例如 我有 require jquery dist jquery v2 1 0 beta2 require underscore
  • 如何使用 JavaScript 获取光标下的单词?

    如果我有 p some long text p 在我的 HTML 页面上 我如何知道鼠标光标位于 文本 一词上方 我的另一个答案仅适用于 Firefox 这个答案适用于 Chrome 也许在 Firefox 中也能工作 我不知道 funct
  • 为什么 Bootstrap 按钮下拉菜单在 iOS 上不起作用?

    看起来甚至连引导演示在这里 http twitter github com bootstrap components html buttonDropdowns不适用于 iOS 您似乎无法在 iPhone 或 iPad 上从中选择项目 有解决
  • JavaScript:所有标准内置对象实际上都是构造函数吗?

    我最近一直在研究 JavaScript 在花了几个月的时间之后 我仍然对一些内部结构感到困惑 具体来说 我试图理解所谓的标准内置对象 https developer mozilla org en US docs Web JavaScript
  • 切换 Ag-Grid 中的浮动过滤器?

    我试图通过开关或按钮单击来确定浮动过滤器的显示 看起来很简单 我应该能够在 true 和 false 之间切换 将该值提供给网格选项中的浮动过滤器 然后刷新标题 对吗 不幸的是 网格似乎总是落后一步 当我第一次点击时 什么也没有发生 当我将
  • JavaScript 回调的效率

    我只是想证实我的一个怀疑 我偶然发现了一篇文章 建议按以下方式使用 Socket io var app require express createServer var io require socket io listen app app
  • Angularjs 使用 ng-init 为 ng-model 赋值

    您好 我有以下问题 看起来很简单并且应该有效 但事实并非如此 在我的代码中我输入了
  • Array.from 的时间复杂度

    时间复杂度是多少Array from 例如 const set new Set set add car set add cat set add dog console log Array from set time complexity o
  • Django 管理中的自定义依赖下拉菜单

    我有一个按阶段模型的项目外键 我很难在 Django 管理页面中创建依赖的下拉列表 我想当用户从该项目的 项目下拉 阶段选择一个项目时 在第二个下拉菜单中显示 实现这一目标的最佳方法是什么 如果下拉列表根据其父级的值来过滤项目 那就太好了
  • 使用 _.extend() 进行 JavaScript 继承

    有什么区别 Employee prototype Object create Person prototype and extend Employee prototype Person prototype 两者都给出相似的结果 输出 但下划
  • Firefox 本地主机上的 Twilio 屏幕共享?

    目前 Firefox 中本地主机上的屏幕共享会引发以下错误 The request is not allowed by the user agent or the platform in the current context 这是我的代码
  • 删除移动设备上的 adsense

    我正在研究响应式设计 但在使用 adsense 时遇到了问题 我有一个广告应该显示在桌面设计上 但不能显示在移动设计上 因此 只有在桌面上查看网站时 才应将广告代码放置在 html 中 css 可以使用 display none 但这违反了
  • 将 html

    我有一些服务器端代码当前支持 http 字节范围请求 没有任何问题 但是 我希望能够在将转码后的块发送到客户端之前使用 ffmpeg 即时转码视频文件 位于磁盘上 但 ffmpeg 要求我在获取字节时给它一个寻道时间范围来自客户 给定客户端
  • JQuery 循环遍历动态元素并获取数据值

    我正在尝试使用可折叠面板来完成我的要求 sport on click function var thisId this attr id var thisChildren this sportlist thisChildren each fu
  • 如何防止外部 CSS 添加和覆盖 ReactJS 组件样式

    我有一个自定义的 ReactJS 组件 我想以某种方式设置样式 并将其作为插件提供给许多不同的网站 但是 当网站使用全局样式 Twitter bootstrap 或其他 css 框架 时 它会添加并覆盖我的组件的样式 例如 全局 css l

随机推荐

  • Laravel 的 utf8 编码问题

    部署我的 laravel 网站 在本地正常工作 后遇到问题 有些文本编码不正确 例如 Jo l 应该是 Jo l 一些信息 并非所有视图都会受到影响 某些变量在一个视图中正确呈现 但在另一个视图上被破坏 这让我认为这不是 mysql 问题
  • img src=webContentLink 中的 Google 云端硬盘图像?

    我可以使用存储在 Google Drive 中的图像通过 html 在网站中使用吗 img src Where
  • 每个新的 ClickOnce 部署版本都会丢失 VB.NET“My.Settings”

    我正在使用 VB NET 中内置的 My Settings 功能来保存应用程序设置 这很方便 但我注意到每次发布新版本时 设置都会丢失 为什么以及如何预防 您需要手动更新您的应用程序设置 我使用这个简单的方法 创建一个名为 MustUpgr
  • 使用 spring-boot:1.5.1 和 spring-cloud-stream 时无法启动 bean 'inputBindingLifecycle'

    使用 spring boot 1 5 1 时出现以下错误 但使用 spring boot 1 4 4 时未出现以下错误 有人遇到过这种情况吗 package org test import lombok Data import lombok
  • 在可可中使用结构列表有意义吗?

    这个问题由此衍生one 在 cocoa 中使用结构列表并不简单 要么使用NSArray并进行编码 解码 要么使用C类型数组并失去NSArray的商品 结构应该很简单 但是当需要列表时 人们倾向于构建一个类 什么时候在可可中使用结构列表才有意
  • Angular 4 路由器在 routerLink 导航上附加组件而不是销毁它们

    当从子模块内从子路由导航到另一个同级子路由时 路由器不会销毁前一个组件 而是在向前和向后导航时附加新组件 为什么会发生这种情况 开始于 subscriber lookup 搬到 subscriber register route a Sub
  • 如何在 R 中抓取 JSP 页面?

    我想在 R 中抓取以下页面的内容 http directoriosancionados funcionpublica gob mx SanFicTec jsp Ficha Tecnica SancionadosN htm 但是 我无法找到任
  • 如何开发和测试一个发送电子邮件的应用程序(无需用测试数据填充某人的邮箱)? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 我有很多发送电子邮件的应用
  • 有没有类似 python 的交互式 REPL 模式,但适用于 Java?

    有没有类似 python 的交互式 REPL 模式 但适用于 Java 例如 这样我就可以输入InetAddress getAllByName localHostName 在一个窗口中 并立即得到结果 而不需要所有这些 public sta
  • 使用 php 客户端使用 Web 服务(Soap)

    我正在尝试为此编写一个客户端网络服务 它使用两层身份验证 一层位于请求标头中 一层用于服务器中的数据访问 这意味着我需要在标头中传递它 这就是我试图做的 class ChannelAdvisorAuth public DeveloperKe
  • 从Python中的单元素字典中提取键名

    如果我知道我的字典总是有一个元素 有没有办法在不通过列表的情况下提取键名称 我目前正在这样做 data foo 1 2 3 key name data keys 0 有没有更有效的技术 迭代字典产生键 Using next iter gt
  • 插件未加载

    这让我抓狂 我检查并重写了很多次代码 仍然不起作用 这里是 http codepen io cwf pen zGBmgm 虽然tablesorter js已加载 tablesorter is undefined 我读了这里所有的问题 但找不
  • lua中通过url下载文件

    Lua初学者在这里 我正在尝试通过 url 加载文件 但不知何故 我太愚蠢了 无法获取此处的所有代码示例来为我工作 如何在 Lua 中下载文件 但在运行时写入本地文件 从给定的url下载文件并将其存储到lua中的给定路径 socket re
  • 如何更改可选函数参数的默认值

    我需要更改全局变量S at a py from b py 但它被用作函数中的默认值a py a py S string def f s S print s print S b py import a def main a S another
  • Karate 支持是否在 html 报告中显示传入模拟服务器 API 请求的服务器端场景的断言或失败? [关闭]

    Closed 这个问题需要细节或清晰度 目前不接受答案 这可能是一个愚蠢的问题 或者可能已经得到回答 但我无法找到任何答案 我需要测试向特定端点或消费者发送 API 请求的微服务 我能够使用空手道成功编写模拟 并根据 服务器端 场景中发生的
  • Facebook 应用程序的 Facebook 集成配置错误

    我正在开发在社交网络上共享照片的 iPhone 应用程序 对于照片共享 我使用 Sharekit 我创建了 Facebook 应用程序并使用其 api 密钥和秘密 使用了正确的 api 密钥和秘密 当我尝试与此应用程序共享图像 甚至是简单的
  • Promise 被拒绝后抛出错误 - Q

    以下是使用 Q 的 Promise 的简短示例 这是 test1 js function testDefer var deferred Q defer fs readFile foo txt utf 8 function error tex
  • 如何重定向到servlet中的错误页面?

    我正在编写 servlet 如果出现异常 我将重定向到我的自定义错误页面 因为我已经这样做了 在 web xml 中
  • TCP服务器haskell字符串比较

    我有一个用 Haskell 编写的小型服务器 当我向它发送内容时 它应该评估发送的内容是否与 auth 函数中的密码 password 匹配 但它永远不是 True 我可以看到发送的消息已通过 因为它打印在 putStrLn msg 处 我
  • JavaScript 的“with”语句有合法用途吗?

    艾伦 斯托姆的评论回应我关于with陈述让我思考 我很少找到使用这种特定语言功能的理由 也从未考虑过它可能会带来什么麻烦 现在 我很好奇如何有效地利用with 同时避免其陷阱 你在哪里找到的with声明有用吗 今天我想到了另一个用途 所以我