我警告不要在我的代码循环中创建函数我使用jslint我的问题是
/*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;
与此同时,非常感谢您的关注和参与。
答案 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
一样。后者没有。