获取警告不要在循环jslint中创建函数

时间:2016-07-04 08:36:48

标签: javascript dom jslint

我警告不要在我的代码循环中创建函数我使用jslint我的问题是

  1. 可以忽略此警告。
  2. 我怎么能纠正这个任何替代方案。
  3. jsfiddle link

    
    
    /*global prompt,alert,console,rgb*/
    /*jslint plusplus: true */
    /*jshint loopfunc: true */
    var colors = [
        'rgb(255, 0, 0)',
        'rgb(255, 255, 0)',
        'rgb(255, 255, 255)',
        'rgb(0, 255, 255)',
        'rgb(0, 255, 0)',
        'rgb(0, 0, 255)'
    ];
    
    var pickedColor = colors[2];
    var square = document.querySelectorAll(".square");
    var i;
    var colorMatch = document.querySelector(".pickedColor");
    for (i = 0; i < square.length; i++) {
        //add different color to square
        square[i].style.background = colors[i];
        //add eventlistner to square
        square[i].addEventListener('click', function () {
            'use strict';
            var selectedColor = (this.style.background);
            if (selectedColor === pickedColor) {
                console.log("True");
            } else {
                console.log('False');
            }
        });
    }
    colorMatch.textContent = pickedColor;
    &#13;
    body{
        background: rgb(52, 73, 94);
    }
    h1{
        color: white;
    }
    .container{
        margin: 0 auto;
        max-width: 600px;
    }
    .square{
        width: 30%;
        margin: 1.66%;
        background-color: purple;
        padding-bottom: 30%;
        float: left;
    }
    &#13;
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Color Game</title>
        <link rel="stylesheet" href="style.css">
    </head>
    <body>
       <h1>The Great <spam class="pickedColor"
       >RGB</spam> Color Game</h1>
       <div class="container">
           <div class="square"></div>
           <div class="square"></div>
           <div class="square"></div>
           <div class="square"></div>
           <div class="square"></div>
           <div class="square"></div>
       </div>
        <script src="script.js"></script>
    </body>
    </html>
    &#13;
    &#13;
    &#13;

    enter image description here

    与此同时,非常感谢您的关注和参与。

3 个答案:

答案 0 :(得分:4)

出于性能原因,创建函数需要一些时间,因此如果不必多次(在循环中),那就更好了。你可以在循环之前定义你的函数,在里面引用它:

function handler() {
        'use strict';
        var selectedColor = (this.style.background);
        if (selectedColor === pickedColor) {
            console.log("True");
        } else {
            console.log('False');
        }
    }

for (i = 0; i < square.length; i++) {
    //add different color to square
    square[i].style.background = colors[i];
    //add eventlistner to square
    square[i].addEventListener('click', handler);
}

答案 1 :(得分:3)

不要创建可能的几十个函数副本,而是创建一个并使用引用。

var square_listener = function() {
    var selectedColor = (this.style.background);
    if (selectedColor === pickedColor) {
        console.log("True");
    } else {
        console.log('False');
    }
}

for (i = 0; i < square.length; i++) {
    square[i].style.background = colors[i];
    square[i].addEventListener('click', square_listener);
}

答案 2 :(得分:2)

特定的情况下,您可以忽略该警告,因为您的函数不会使用它们关闭的任何变量(如i)在循环过程中发生变化。

但是既然他们没有,那么只有一个人可以创建这个功能的几个副本:

function squareClick() {
    'use strict';
    var selectedColor = (this.style.background);
    if (selectedColor === pickedColor) {
        console.log("True");
    } else {
        console.log('False');
    }
}

for (i = 0; i < square.length; i++) {
    //add different color to square
    square[i].style.background = colors[i];
    //add eventlistner to square
    square[i].addEventListener('click', squareClick);
}

哪里会出问题:

假设你这样做并且有8个方格:

for (i = 0; i < square.length; i++) {
    square[i].addEventListener('click', function() {
        alert(i); // <=== Using i
    });
}

当您点击这些方块时,无论您点击哪个方格,都会看到值8,因为这些函数对i变量有一个实时引用,而不是副本变量创建时的变量。

这就是为什么jsLint会警告你这个问题的一部分:要么你需要小心(因为你正在使用i),要么在循环中创建函数是没有意义的(因为你没有使用任何东西)变化)。

最后注意事项:在ES2015中,您可以安全地执行此操作:

for (let n = 0; n < square.length; n++) {
    square[n].addEventListener('click', function() {
        alert(n); // <=== Using n
    });
}

...你会看到0,1,2,... 7取决于你点击的方格。这是因为 let循环中for声明的ES2015 +语义是专门为确保每个循环迭代获得自己的n副本而设计的。与使用var的看似接近完全相同的版本非常不同

var的示例;他们都显示8:

var square = document.querySelectorAll(".square");
for (var i = 0; i < square.length; i++) {
  square[i].addEventListener('click', function() {
    alert(i); // <=== Using i
  });
}
<div class="square">zero</div>
<div class="square">one</div>
<div class="square">two</div>
<div class="square">three</div>
<div class="square">four</div>
<div class="square">five</div>
<div class="square">six</div>
<div class="square">seven</div>

let示例(在ES2015 +兼容浏览器上);他们显示0 ... 7:

var square = document.querySelectorAll(".square");
for (let n = 0; n < square.length; n++) {
  square[n].addEventListener('click', function() {
    alert(n); // <=== Using n
  });
}
<div class="square">zero</div>
<div class="square">one</div>
<div class="square">two</div>
<div class="square">three</div>
<div class="square">four</div>
<div class="square">five</div>
<div class="square">six</div>
<div class="square">seven</div>

请注意let必须 for才能启用此处理。即

let n;
for (n = 0; n < square.length; ++n)

非常不同
for (let n = 0; n < square.length; ++n)

前者在循环内创建的函数方面就像var一样。后者没有。