我希望 onclick 函数在调用 onclick 函数的实例上记住 for 循环中变量 i 和 j 的值。但是,变量在存储在 onclick 函数中之前会更新。
我正在制作一个井字游戏应用程序,不想手动添加所有 onclick 语句,因为这对于大型项目来说是一种不好的做法。
for (j = 0; j < Columns; j++) {
var col = document.createElement("td")
row.appendChild(col)
col.id = i + "" + j;
col.onclick = function() {
console.log(i, j)
place(i + "" + j)
}
}
没有错误消息,但我不知道如何保存调用 onclick 函数的实例的变量。调用 onclick 函数时如何保存变量?
您必须通过使用let
来限定变量的范围,这样您就可以专门为该迭代限定它的范围。避免声明像i = 0
这样的变量,因为这样你就会创建一个全局变量,它不会在'use strict'
的情况下工作(抛出错误)。
let Columns = 3
let rows = 3
const table = document.getElementById("table")
for (let i = 0; i < rows; i++) {
let row = document.createElement("tr");
row.textContent = "row " + i;
table.appendChild(row)
for (let j = 0; j < Columns; j++) {
var col = document.createElement("td")
row.appendChild(col)
col.id = i + "" + j;
col.onclick = function() {
console.clear()
console.log(i, j)
}
}
}
tr, td{
border: 1px solid;
min-height: 60px;
min-width: 60px;
}
<table id="table"></table>
如果你不能使用let
(可能是因为它是 ES6),你可以使用通用var
,但随后你需要bind
函数上的值,如下面的代码所示:
var Columns = 3
var rows = 3
var table = document.getElementById("table")
for (var i = 0; i < rows; i++) {
var row = document.createElement("tr");
row.textContent = "row " + i;
table.appendChild(row)
for (var j = 0; j < Columns; j++) {
var col = document.createElement("td")
row.appendChild(col)
col.id = i + "" + j;
col.onclick = function(rowI, colJ) {
console.clear()
console.log(rowI, colJ)
}.bind(this, i, j) //bind parameters -> this is the context
}
}
tr, td{
border: 1px solid;
min-height: 60px;
min-width: 60px;
}
<table id="table"></table>