JSlint 错误“不要在循环内创建函数。”引发关于 Javascript 本身的问题

2023-12-08

我有一些在循环中调用匿名函数的代码,类似于这个伪示例:

for (i = 0; i < numCards; i = i + 1) {
    card = $('<div>').bind('isPopulated', function (ev) {
        var card = $(ev.currentTarget);
        ....

JSLint 报告错误“不要在循环内创建函数”。我喜欢保持我的代码 JSLint 干净。我知道我可以将匿名函数移出循环并将其作为命名函数调用。除此之外,这是我的问题:

Javascript 解释器真的会在每次迭代时创建一个函数实例吗?或者真的只有一个函数实例被“编译”并且相同的代码被重复执行?也就是说,JSLint 将函数移出循环的“建议”实际上会影响代码的效率吗?


部分取决于您是否使用函数表达式 or a 函数声明。它们是不同的事情,发生的时间不同,对周围范围的影响也不同。那么让我们从区别开始吧。

一个功能表达 is a function使用结果作为右侧值的生产 - 例如,您将结果分配给变量或属性,或者将其作为参数传递到函数中,等等。这些都是函数表达式:

setTimeout(function() { ... }, 1000);

var f = function() {  ... };

var named = function bar() { ... };

(不要使用最后一个——它被称为命名函数表达式- 实现有错误,特别是IE.)

相比之下,这是一个函数声明:

function bar() { ... }

它是独立的,您不使用结果作为右手值。

它们之间的两个主要区别:

  1. 函数表达式在程序流程中遇到的地方进行计算。当控制进入包含范围(例如,包含函数或全局范围)时,将对声明进行评估。

  2. 函数的名称(如果有)在函数的包含范围中定义宣言。它不是为了一个功能表达(排除浏览器错误)。

你的匿名函数是函数表达式,因此除非解释器进行优化(这是免费的),它们将在每个循环中重新创建。因此,如果您认为实现会优化,那么您的使用就很好,但是将其分解为命名函数还有其他好处,而且重要的是,不会花费您任何费用。另请参阅卡萨布兰卡的回答有关口译员为何不可以的说明able优化在每次迭代时重新创建函数,具体取决于它检查代码的深度。

更大的问题是如果你使用了一个函数宣言在循环中,条件体等:

function foo() {
    for (i = 0; i < limit; ++i) {
        function bar() { ... } // <== Don't do this
        bar();
    }
}

从技术上讲,仔细阅读规范的语法表明它是invalid这样做,尽管实际上没有任何实现真正强制执行这一点。实施措施有哪些do情况多种多样,最好远离它。

对于我来说,最好的选择是使用单个函数声明,如下所示:

function foo() {
    for (i = 0; i < limit; ++i) {
        bar();
    }

    function bar() {
        /* ...do something, possibly using 'i'... */
    }
}

你得到相同的结果,实现不可能在每个循环上创建一个新函数,你得到函数有名字的好处,你不会失去任何东西。

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

JSlint 错误“不要在循环内创建函数。”引发关于 Javascript 本身的问题 的相关文章

  • 如何从 Chrome 扩展中获取 javascript 重的页面

    我正在开发一个扩展程序 用于获取用户可能在网站上访问的页面 我的扩展使用 jQuery get 来获取页面 这对于像 amazon com 这样的网站来说是正确的 但是 如果用户登录 gmail 并且我尝试获取其他一些页面 例如 帐户设置
  • JavaScript(或 jQuery)中有“有焦点”吗?

    我可以这样做吗 也许通过插件 if form contact input hasFocus form contact input first focus 基本上 将焦点设置为第一个输入 但前提是用户尚未单击任何内容 我知道这也行 但是还有更
  • 从 HTML 模板调用异步函数(Retunes Observable)

    HTML 模板上显示的数据是关键表单数据 意思是 需要翻译 为此 我想从我的模板中调用异步函数 尝试过这个 但没有成功 模板 span class myClass rowValue translateServingStyle size de
  • 如何在 HTML 链接中使用 JavaScript 变量

    我正在开发的网站有一个标签指向与网站所具有的 URL 不同的 URL 我想做的是绕过使用下面的 trueURL 标记来查找网页的网址 因为我需要它来构造一些内部锚点 因为我需要网站的实际网址 以便内部锚点正常工作 我遇到的问题是我不知道应该
  • 将全局样式表与故事书和角度结合使用 - SassError:SassError:预期“{”

    几天来 我一直在尝试将全局样式表集成到故事书中 我已经从 sass 支持文档中集成了 webpackFinal 配置 在 storybook 目录中 我创建了一个 scss loader scss 文件 该文件应该加载全局样式表 在 pre
  • jquery如何获取右、左、上、下箭头键值

    我使用了下面的代码 每当单击箭头键 左 右 上 下 时 我得到的键值为 0 任何人都可以帮忙解决这个问题吗 document keypress function e alert key value e which 如何获取 上 下 右 左
  • IE9:奇怪的 JavaScript 错误

    我尝试在网站中显示 Google DFP 广告横幅时遇到错误 这些广告在除 IE9 之外的所有浏览器中展示 您可以在此处查看带有横幅的简单测试页面 离线演示 错误是 抛出异常但未捕获 google ads js 第 34 行字符 474 I
  • img设置flex-grow来填充flex容器剩余空间,它会导致flex内部溢出flex容器[重复]

    这个问题在这里已经有答案了 以下是我的代码 text1 溢出 Flex 容器 我期望 Flex 容器中的 img 文本和 img 填充 Flex 容器其余部分
  • 创建一个通用函数以将其用于其他数据

    我正在制作一个项目列表 并希望随着数量变化计算其值 但如何使该函数通用以便我可以将它用于所有行 你能建议一些最好和简单的方法 但请记住我想这样做仅限 JavaScript table thead tr th Name th th Quant
  • 如何从 HTML 图表中删除网址 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在 HTML 中创建一个图表 我正在使用 API amCharts 但问题是它在图表中显示文本 amchart 我怎样才能删除该文本
  • Javascript 搜索并替换包含方括号的字符序列

    我正在尝试在字符串 Nationality EN ESP 中搜索 EN 我想从字符串中删除它 所以我使用替换方法 代码示例如下 var str Nationality EN ESP var find EN var regex new Reg
  • 如何将多种语言设置放入单个 .clang-format 文件中

    我想为 java javascript 和 c 创建一个 clang 格式 我知道如何转储单一语言的示例配置 但不知道如何合并这 3 个配置文件 有关如何将多种语言配置放入单个文件中的示例 BasedOnStyle LLVM IndentW
  • Svg 点击事件无法正常工作

    我试图让我的 SVG 看起来像一个 饼形 看起来一切都很好 此外 我希望它们每个都有不同的点击事件 function one alert 1 function two alert 2 function three alert 3 funct
  • 在 for 循环中突破 Promise 块

    我有以下代码 this storeNameValidate function stores var deferred q defer console log stores for storeIndex in stores this name
  • 如何根据父网格的标题复选框选择/取消选择所有子复选框

    我正在开发一个 Web 应用程序 其中包含嵌套在另一个数据网格中的数据网格 在父网格中 我在标题模板中有一个复选框 在子网格中的项目模板中有另一个复选框 功能是 1 如果我单击父复选框 则应检查子网格中的所有项目 反之亦然 2 我的子网格中
  • Select2 触发器(“更改”)创建无限循环

    假设页面上有两个 select2 元素 都使用 onChange 为了以编程方式在一个 select2 元素中设置一个值 您可以使用 id1 val xyz trigger change 如果您在这两个元素之一中进行选择时想要将另一个元素重
  • 如何在 AngularJS 中设置选择选项中的文本格式?

    我有以下 json 对象 scope values id 2 code Code 1 name Sample 1 id 4 code Code 2 name Sample 2 id 7 code Code 3 name Sample 3 在
  • 对数滑块

    我有一个值范围从 0 到 100 的滑块 我想将它们映射到 100 到 10 000 000 的范围 我在网上看到过一些函数 但它们都是用 C 编写的 我需要它在 JavaScript 中 有任何想法吗 您可以使用这样的函数 functio
  • codemirror - 在编辑器内检测并创建链接

    我正在使用 codemirror 配置为显示 javascript 我有这样的代码 var ref http www example com test html var ref2 http www example com test2 htm
  • 如何使我的响应式网站在手机上支持“请求桌面网站”?

    我有一个响应灵敏的动态网站 Java Servlet 驱动且完全手工编码 由于它是一个返回数据表的科学站点 因此某些选项在较小的视口宽度下不可用 然而 可能有些用户更喜欢在桌面网站上挣扎才能访问这些选项 我希望适应他们 我的问题是 对于 i

随机推荐

  • 如何让所有 .py 文件通过 Spyder 启动?

    我使用 Anaconda 安装了 Spyder 并且可以使用开始菜单 Win10 中的 Spyder 图标启动 IDE 我想设置我的首选项以打开所有 py文件与 Spyder 所以我按照 Spyder 开始菜单按钮找到可执行文件 pytho
  • 使用 JavaScript 检查 HTML 片段是否有效

    我需要一个可靠的 JavaScript 库 函数来检查我可以从代码中调用的 HTML 片段是否有效 例如 它应该检查打开的标签和引号是否闭合 嵌套是否正确等 我不希望验证失败 因为某些东西不是 100 标准 但无论如何都会起作用 Updat
  • 矩阵求幂方法JAVA

    我很难创建一种方法来提高矩阵的幂 我尝试使用这个 public static int powerMethod int matrix int power int temp matrix for int i power i 1 i temp t
  • 在Excel中将大时间格式转换为小数

    我正在尝试将 Excel 中的大时间值转换为小时的十进制数 我目前有一列为呼叫中心添加了 就绪时间 总和为 3545 20 02 我现在希望以十进制格式显示相同的时间 例如3545 333 因为它用于另一个计算 作为参考 当我将上述时间转换
  • 如何在 Windows 10 和 Python 3.8 上安装适用于 C# (VS2019) 的 Python.NET?

    Python NET的官方网站上说支持Python 3 8 伟大的 现在我有兴趣从用 C NET Framework v4 7 2 开发的应用程序调用现有的 python 3 8 模块 EDITS 由于 Python NET 的作者几乎没有
  • 限制 Github API 只能访问某个用户的一个存储库

    我们有一个 Web 应用程序 它允许用户编写代码并将其存储在我们服务器上的内部 git 存储库中 现在我们希望允许用户与他的 github 存储库共享他的代码 于是我们查阅了github的api文档 找到了通过ouath2的方法 然而 为了
  • 在 VB.NET 中跨表单共享变量的最佳实践

    我需要在 VB NET 中的两个窗体之间共享变量 其中一个是主窗体 另一个是子窗体 我一直在寻找 找到了一些方法 我想用最好的方法来做到这一点 我在下面列出了几个选项 请评论哪一个是最佳选择 在其中一种形式中创建静态 共享变量 并通过以下方
  • JavaScript - 从具有 m 个元素的 n 个数组生成组合[重复]

    这个问题在这里已经有答案了 我在编写代码时遇到困难 无法在 JavaScript 中从 n 个数组 其中有 m 个元素 生成组合 我在其他语言中看到过类似的问题 但答案包含了我不确定如何翻译的语法或库魔法 考虑这个数据 0 1 0 1 2
  • 了解 fork()、sleep() 和进程通量

    一直在练习这些系统调用 但我坚持使用这段代码 include
  • 如何找到活跃的短信?

    有什么方法可以知道免费 活跃短信的数量吗 或者至少读取每个SM的电压 功率或温度值 通过它我可以知道它是否工作 在 GPU 设备上执行某些作业时实时执行 smid 帮助我了解了每个 SM 的 Id 类似的东西会有所帮助 感谢致敬 拉凯什 C
  • 由于 cloudflare 无法从 url 读取数据

    每当我编译时 我都会得到这个 线程 main 中的异常 java io IOException 服务器返回 HTTP 响应代码 403 对于 URL 链接 sun net www protocol http HttpURLConnectio
  • 使用相同的模型填充多个组合框,但选择差异

    有问题ComboBox 我已经填充了多个ComboBoxes 具有相同的模型 但是当我运行程序并从一个组合框中选择一个值时 它会为其余的组合选择相同的值 ComboHBoy setModel defaultComboBoxModel Com
  • 将 IsEnabled 属性绑定到 WPF 中的布尔值

    我有一个TextBox需要以编程方式启用 禁用 我想使用绑定来实现这一点Boolean 这里是TextBox XAML
  • 创建 SVG 使用

    当我在 HTML 中添加此 SVG 时 它会显示 当我尝试使用 JS 构建它时 它不显示 他们的代码看起来相同 显然我忽略了一些东西 在 HTML 作品中 div div
  • ASP.NET 原因: 在应用程序之外使用注册为allowDefinition='MachineToApplication' 的节是错误的...?

    我有一个 ASP NET 网站 我在 VS 2008 中不断收到以下错误 该网站在浏览器中工作正常 我已使用 IIS 管理器将每个文件夹制作为 ASP NET 应用程序 为什么它总是抱怨 该站点的文件夹位于父文件夹下方 我不熟悉网站应用程序
  • Django - 将 InMemoryUploadedFile 发布到外部 REST api

    在 Django Rest Framework 中 我想发布一个文件 该文件作为InMemoryUploadedFile 一旦收到就发送到不同的服务器 听起来很简单 但是request post 函数似乎无法正确发送这样的文件 def po
  • 如何在 PHP 中将视频转换过程“分叉”到后台?

    我有一个批量 Flash 上传脚本 可将视频文件上传到目录 简单的 上传完成后 它会为该文件创建一条 mysql 记录 然后继续处理队列中的下一个文件 就在执行此操作之前 我希望它调用一个后台进程 将上传的 avi avi 文件转换为 ip
  • 如何找到正确的 UUID?

    大约一周前 我收到了某人的帮助 但我的代码似乎仍然存在问题 我运行的是 Android 2 0 因此无法使用这些方法来获取 UI 而是需要反射性地调用这些方法 下面是我的代码 public ConnectThread BluetoothDe
  • 用 R 中相邻单元格的值填充 NA

    这个问题可能听起来与该论坛上的各种其他问题类似 在将其标记为重复之前 请确保重复的问题在我的情况下有效 我有一个数据框 df1 如下 gt df1 lt data frame c1 c ER017 ER017 ER017 ER017 ER0
  • JSlint 错误“不要在循环内创建函数。”引发关于 Javascript 本身的问题

    我有一些在循环中调用匿名函数的代码 类似于这个伪示例 for i 0 i lt numCards i i 1 card div bind isPopulated function ev var card ev currentTarget J