【问题标题】:JSlint: unexpected 'for' [duplicate]JSlint:意外的'for' [重复]
【发布时间】:2015-08-11 16:03:53
【问题描述】:

我一直在测试单选按钮。一切似乎都很好,直到我通过 JS lint 运行它。我修复了除一个以外的所有错误:

意外的“为”

for (i = 0; i < radios.length; i += 1) {

这是我的 Javascript:

/*global body,window,document,alert*/
(function () {
"use strict";

var UIlogic;

UIlogic = {
    myLoad: function () {
        var elems, elemText, btn1, winter, summer, fall, spring, header, btns;

        winter = "<div><input type='radio' name='cb' id='cbA' value='0'/><label for='cbA'>Winter</label></div>";
        summer = "<div><input type='radio' name='cb' id='cbB' value='1'/><label for='cbB'>Summer</label></div>";
        fall = "<div><input type='radio' name='cb' id='cbC' value='2'/><label for='cbC'>Fall</label></div>";
        spring = "<div><input type='radio' name='cb' id='cbD' value='3'/><label for='cbD'>Spring</label></div>";

        header = "Header";

        btns = "<br /><button class='btns' id='btn1'>Go!</button>";

        elemText = "Menu/nav";

        elems = "<center><div>" + header + "</div></center>";//title
        elems += "<div>" + elemText + "</div></center>";//menu
        elems += "<div id='container'><br />";//container opens
        elems += "<div id='div1'>" + winter + "</div>";
        elems += "<div id='div2'>" + summer + "</div>";
        elems += "<div id='div2'>" + fall + "</div>";
        elems += "<div id='div2'>" + spring + "</div>";
        elems += "<div id='div3'>" + btns + "</div>";
        elems += "</div>";//container closes
        elems += "<h6><div id='footer'>Ehawk 2015</div></h6>";

        body.innerHTML = elems;
        btn1 = document.getElementById("btn1");
        btn1.addEventListener('click', UIlogic.intoFunction, false);

    },
    intoFunction: function () {
        var radios, found, i = 0;
        radios = document.getElementsByName("cb");
        found = 1;
        for (i = 0; i < radios.length; i += 1) {//issue occurs here
            if (radios[i].checked) {
                alert(radios[i].value);
                found = 0;
                break;
            }
        }
        if (found === 1) {
            alert("Please Select Radio");
        }
    }
};
window.onload = function () {
    UIlogic.myLoad();
};
}());

我的循环运行错了吗?为什么即使代码有效,JSlint 也会在这里看到问题?我真的可以对循环使用一些见解,因为我对它们有最多的问题。我被告知不要使用它们,但我没有看到运行循环来检测单选按钮和检查单选的问题。这是我应该关心的事情吗?

【问题讨论】:

标签: javascript jslint


【解决方案1】:

Here's the best explanation I could find for you,

最近我决定不再使用for。我已经完成了for 循环。 for 循环被发明出来,它们来自 Fortran。它们原本是一种处理数组的方式,但在 ES5 中我们添加了 forEach()map() 以及所有其他的,我想‘是的,这就是这样做的方式’。无论如何,for 的语法对于包含三个语句的东西来说太奇怪了。

Crockford 进一步谈到在 ES6 中完全使用循环构造,而只使用函数构造。

您可以选择忽略它 - 只需将选项传递给 JSLint 以容忍for


但是,假设您决定取消现有的 for 循环。您可以使用every()。它会类似于(未测试):

intoFunction: function () {
    var radios, found; 
    radios = document.getElementsByName("cb");
    found = Array.prototype.slice.call(radios).every(function(radio) {
        if (radio.checked) { 
            alert(radio.value); 
            return false; 
        }
        return true; 
    }); 

    if (found) {
        alert("Please Select Radio");
    }
}

在我看来,如果for 循环更容易理解的话,这是有争议的。老实说,这取决于您自己的个人/项目的编码标准。


更新了一个工作 sn-p 演示 every() 来完成此操作。

function into() {
  var radios, found;
  radios = document.getElementsByName("cb");
  found = Array.prototype.slice.call(radios).every(function(radio) {
    if (radio.checked) {
      alert(radio.value);
      return false;
    }
    return true;
  });

  if (found) {
    alert("Please Select Radio");
  }
}

jQuery("[name='cb']").on("click", into);
jQuery("button").on("click", function() {
  jQuery("[name='cb']").prop("checked", false);
  into();
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<p>
  <label>
    <input type="radio" name="cb" value="M">Male</label>
</p>
<p>
  <label>
    <input type="radio" name="cb" value="F">Female</label>
</p>
<p>
  <label>
    <input type="radio" name="cb" value="I">I don't know</label>
</p>
<p>
  <label>
    <input type="radio" name="cb" value="B">Both</label>
</p>
<p>
  <button>Clear Radios</button>

【讨论】:

  • 刚刚看到你的编辑,我要试试。谢谢!
  • “for”循环肯定更容易理解。
  • @Bobort 我没有争论...
【解决方案2】:

JSLint 建议您使用其他循环,例如 forEach。 http://www.jslint.com/help.html#for

如果这让您感到困扰,您可以选择底部的容忍“for 语句”选项,但代码看起来不错。

【讨论】:

  • 很好的发现。这是我对“接受的答案”的投票。
  • 这个建议有一个问题——你不能像原来的for循环那样打破forEach()。在这种情况下考虑every()
猜你喜欢
  • 2012-08-13
  • 2011-03-01
  • 2016-05-21
  • 2015-02-09
  • 2012-02-29
  • 2017-05-22
  • 1970-01-01
  • 2012-06-23
相关资源
最近更新 更多