jjzjj

javascript - JsHint W083 不要在循环中创建函数和 jQuery 的 $.each() 函数

coder 2024-07-28 原文

我目前正在使用 JsHint 并收到警告 W083:“不要在循环内创建函数”。我从 JsLint Error Explanations 读到这篇文章并理解为什么你不应该这样做,这基本上归结为 JavaScript 的异步性质和变量被覆盖的可能性。

但是,我也在 SO 上阅读了其他一些帖子,虽然这是失礼,但根据情况并不总是会导致错误。

JsHint 提示的特别是我的情况是一个使用 jQuery $(selector).each() 函数的 for 循环。这个函数接受一个函数作为参数。下面是我关心的代码片段。不要担心它实际做了什么+ 因为我真的只是用这个作为例子:

for (var i = 0; i < sections.length; i++) {
    disableSectionState[sections[i].name] = {};

    $('.' + sections[i].name).each(function (index, element) {
        var id = $(element).attr('id');
        disableSectionState[sections[i].name][id] = $(element).attr('disabled');
    });

    if (sections[i].isChecked) {
        $('.' + sections[i].name).attr('disabled', 'disabled');
    }
}

本质上,这只是一个 for 循环中的嵌套 for-each 循环,所以我认为这不会太危险,但我显然不熟悉 js 中的所有怪癖。 截至目前,尤其是使用此函数时,一切正常,但我想向社区询问在循环中使用 jQuery 的 each 函数的危险。

为了防止这被标记为欺骗,我确实看到了 this SO 问题,但唯一的答案没有详细说明或解释任何内容,并且根据评论它看起来像一个 XY 问题。我对为什么更感兴趣,因为它的核心是它本质上是一个嵌套循环。

在循环外提取和命名这个函数真的那么安全吗?如果我将循环计数器复制到匿名函数范围内的变量,是否会消除这种设计的潜在危险?该函数是否在主 for 循环之外完全异步执行?

+如果您真正感兴趣:此代码用于确定在启用某些选项的情况下是否应在页面加载时禁用某些字段。

最佳答案

问题不是在循环中使用 jQuery 的 each,而是重复声明一个函数。这可能会导致一些奇怪的关闭问题(该函数关闭对循环计数器的引用,它仍然会更新并可以更改)并且可能是不太聪明的 VM 上的一个重要的性能问题。

JSHint 要求您更改的所有内容是:

function doStuff(index, element) {
  var id = $(element).attr('id');
   disableSectionState[sections[i].name][id] = $(element).attr('disabled');
}

for (var i = 0; i < sections.length; i++) {
  disableSectionState[sections[i].name] = {};

  $('.' + sections[i].name).each(doStuff);

  if (sections[i].isChecked) {
    $('.' + sections[i].name).attr('disabled', 'disabled');
  }
}

当您从循环中异步调用某些内容并关闭循环计数器时,大多数危险都会出现。举个例子:

for (var i = 0; i < urls.length; ++i) {
  $.ajax(urls[i], {success: function () {
    console.log(urls[i]);
  });
}

您可能认为它会在请求成功时记录每个 URL,但是由于 i 可能会在任何请求从服务器返回之前达到 length,所以您更可能会反复看到最后一个 URL。如果您考虑一下,这是有道理的,但如果您没有密切关注闭包或有更复杂的回调,则可能是一个微妙的错误。

不在循环内声明函数会强制您显式绑定(bind)或传递循环计数器以及其他变量,并防止此类事件意外出现。

在一些更天真的实现中,机器实际上还可以在循环的每次迭代中为函数创建一个闭包范围,以避免在循环内更改的变量出现任何潜在的异常。这会导致很多不必要的作用域,从而影响性能和内存。

关于javascript - JsHint W083 不要在循环中创建函数和 jQuery 的 $.each() 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30484517/

有关javascript - JsHint W083 不要在循环中创建函数和 jQuery 的 $.each() 函数的更多相关文章

  1. ruby - 在没有 sass 引擎的情况下使用 sass 颜色函数 - 2

    我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re

  2. ruby-on-rails - 在 ruby​​ 中使用 gsub 函数替换单词 - 2

    我正在尝试用ruby​​中的gsub函数替换字符串中的某些单词,但有时效果很好,在某些情况下会出现此错误?这种格式有什么问题吗NoMethodError(undefinedmethod`gsub!'fornil:NilClass):模型.rbclassTest"replacethisID1",WAY=>"replacethisID2andID3",DELTA=>"replacethisID4"}end另一个模型.rbclassCheck 最佳答案 啊,我找到了!gsub!是一个非常奇怪的方法。首先,它替换了字符串,所以它实际上修改了

  3. ruby - 在 Ruby 中有条件地定义函数 - 2

    我有一些代码在几个不同的位置之一运行:作为具有调试输出的命令行工具,作为不接受任何输出的更大程序的一部分,以及在Rails环境中。有时我需要根据代码的位置对代码进行细微的更改,我意识到以下样式似乎可行:print"Testingnestedfunctionsdefined\n"CLI=trueifCLIdeftest_printprint"CommandLineVersion\n"endelsedeftest_printprint"ReleaseVersion\n"endendtest_print()这导致:TestingnestedfunctionsdefinedCommandLin

  4. ruby-on-rails - Rails - 从另一个模型中创建一个模型的实例 - 2

    我有一个正在构建的应用程序,我需要一个模型来创建另一个模型的实例。我希望每辆车都有4个轮胎。汽车模型classCar轮胎模型classTire但是,在make_tires内部有一个错误,如果我为Tire尝试它,则没有用于创建或新建的activerecord方法。当我检查轮胎时,它没有这些方法。我该如何补救?错误是这样的:未定义的方法'create'forActiveRecord::AttributeMethods::Serialization::Tire::Module我测试了两个环境:测试和开发,它们都因相同的错误而失败。 最佳答案

  5. ruby - 为什么 Ruby 的 each 迭代器先执行? - 2

    我在用Ruby执行简单任务时遇到了一件奇怪的事情。我只想用每个方法迭代字母表,但迭代在执行中先进行:alfawit=("a".."z")puts"That'sanalphabet:\n\n#{alfawit.each{|litera|putslitera}}"这段代码的结果是:(缩写)abc⋮xyzThat'sanalphabet:a..z知道为什么它会这样工作或者我做错了什么吗?提前致谢。 最佳答案 因为您的each调用被插入到在固定字符串之前执行的字符串文字中。此外,each返回一个Enumerable,实际上您甚至打印它。试试

  6. jquery - 我的 jquery AJAX POST 请求无需发送 Authenticity Token (Rails) - 2

    rails中是否有任何规定允许站点的所有AJAXPOST请求在没有authenticity_token的情况下通过?我有一个调用Controller方法的JqueryPOSTajax调用,但我没有在其中放置任何真实性代码,但调用成功。我的ApplicationController确实有'request_forgery_protection'并且我已经改变了config.action_controller.consider_all_requests_local在我的environments/development.rb中为false我还搜索了我的代码以确保我没有重载ajaxSend来发送

  7. ruby - ruby 中有 each_if 吗? - 2

    假设我在Ruby中有这个each循环。@list.each{|i|putsiifi>10breakend}我想循环遍历列表直到满足条件。这让我感到“不像Ruby”,因为我是Ruby的新手,是否有Ruby方法可以做到这一点? 最佳答案 您可以使用Enumerable#detect或Enumerable#take_while,取决于您想要的结果。@list.detect{|i|putsii>10}#Returnsthefirstelementgreaterthan10,ornil.正如其他人所指出的,更好的风格是先进行子选择,然后再对其

  8. ruby - 如何在 Ruby 中创建无类 DSL? - 2

    我正在尝试找出如何为我的Ruby项目创建一种“无类DSL”,类似于在Cucumber步骤定义文件中定义步骤定义或在Sinatra应用程序中定义路由。例如,我想要一个文件,其中调用了我的所有DSL函数:#sample.rbwhen_string_matches/hello(.+)/do|name|call_another_method(name)end我认为用我的项目特有的一堆方法污染全局(内核)命名空间是一种不好的做法。因此方法when_string_matches和call_another_method将在我的库中定义,并且sample.rb文件将以某种方式在我的DSL方法的上下文中

  9. ruby - @things.each 或 5 次做 |t| - 2

    有没有一种方法可以让迭代器在对象为nil时仍然进行迭代?例如,我想从我的应用程序中剥离我的View并为设计师创建一个虚拟应用程序。所以我希望它迭代或循环。如何做到这一点?我刚刚找到了一种方法 最佳答案 你应该能够使用这样的东西:(@things||dummy_things).eachdo|thing|#dosomethingwiththingenddefdummy_thingsdummies=[]5.timesdodummies.push(Thing.new)enddummiesend因此,如果@things为nil,那么它的作用是

  10. ruby-on-rails - 如何在 Rails 3 中创建自定义脚手架生成器? - 2

    有这些railscast。http://railscasts.com/episodes/218-making-generators-in-rails-3有了这个,你就会知道如何创建样式表和脚手架生成器。http://railscasts.com/episodes/216-generators-in-rails-3通过这个,您可以了解如何添加一些文件来修改脚手架View。我想把两者结合起来。我想创建一个生成器,它也可以创建脚手架View。有点像RyanBates漂亮的生成器或web_app_themegem(https://github.com/pilu/web-app-theme)。我

随机推荐