javascript - 为什么当我运行与 onclick 属性绑定的函数时我的类属性未定义?
问题描述
我正在尝试制作一个 noughts and crosses 游戏,每个单元格都是 Cell 类的对象,每个类都将包含多个属性,例如特定单元格在 HTML 中绑定到的 div 元素,这样我就可以更改其样式div 如果它被点击。
但是,当尝试将每个 Cells onclick 属性分配给类中的方法时,我在构造函数中定义的类变量未定义。我无法解决它的范围,我尝试 var self = this;
在构造函数中使用并使用它而不是 this 作为方法。我已经阅读了与此类似的其他多个问题,但是我似乎无法解决问题。
class Cell
{
constructor(cellDiv)
{
this.clicked = false;
this.cellDiv = cellDiv;
this.player = 7;
this.cellDiv.className = "cell";
}
output()
{
console.log(this.player);
console.log(this.clicked);
console.log(this.cellDiv);
}
}
var grid = [];
function buildBoard ()
{
for (var i = 0; i < 9; i ++)
{
grid.push(new Cell(document.createElement("div")));
document.getElementById("gameBoard")
.appendChild(grid[i].cellDiv);
grid[i].cellDiv.onclick = grid[i].output;
grid[i].output();
}
}
<!DOCTYPE html>
<html lang = "en">
<head>
<meta charset = "UTF-8">
<title>Task 3</title>
<link rel = "stylesheet"; type = "text/css"; href = "stylesheet.css" />
</head>
<body>
<script type = "application/javascript"; src ="main.js"></script>
<script type = "application/javascript"; src ="cell.js"></script>
<div class = "gameBoard"; id = "gameBoard"></div>
<script type="text/javascript">
buildBoard();
</script>
</body>
</html>
目前这会创建 9 个单元格,将它们全部放在板上,分配它们的 onclick 属性,然后输出我单击单元格时期望输出的内容。但是,当在 for 循环中调用输出函数时,一切都按预期输出,但是当我单击每个 div 时,我收到未定义的变量。
<code>
main.js:38 7
main.js:39 false
main.js:38 undefined
main.js:39 undefined
</code>
干杯!
解决方案
您需要将该output
方法绑定到您的类。有多种方法,但最紧凑的方法是将其分配给箭头函数。
class Cell {
constructor () { ... }
output = () =>
{
console.log(this.player);
console.log(this.clicked);
console.log(this.cellDiv);
}
}
推荐阅读
- c# - 如何在 C# 中获取 JITed 代码的地址?
- java - 如何使用Java将文本附加到一个目录中的多个文件
- java - Socket 到 Socket 通信,Server 仅充当中间人
- ruby-on-rails - 如何在activerecord中切换两个表
- javascript - 创建一个接收整数并以螺旋格式返回 NxN 二维数组的函数
- maven - Flyway maven插件设置
- javascript - 为什么需要@babel-core
- c# - 如何在没有附加类的情况下解析 json?
- node.js - 找到所需文件后,如何立即停止递归搜索目录?
- python - 如何从 Pandas 数据框中获取 1 和 0 的最大连续数量