在本例中,我假设该网页是一个计算器,类似于:
|---------------|
| |
|---------------|
| 1 | 2 | 3 | * |
|---|---|---|---|
| 4 | 5 | 6 |/|
|---|---|---|---|
| 7 | 8 | 9 | = |
|---------------|
在这种情况下,按钮buttons[i]
是计算器按钮中的一个; | 1 |
,| 5 |
等按钮的实际数量是它的指数,所以buttons[2]
是| 2 |
,buttons[7]
会| 7 |
,等我猜其他值,像buttons[0]
和buttons[10]
,是经营者的按钮(| = |
,| * |
,|/|
)。
现在,当对这些按钮中的一个,在按钮上的字符,这是该按钮的innerHtml
,被添加到用户点击计算器的result
(通过将其添加到结果的innerHTML
),这仅仅是一个显示操作。所以,如果我点击| 3 |
,然后| * |
,然后| 5 |
,计算器看起来像
|---------------|
| 3*5 |
|---------------|
| 1 | 2 | 3 | * |
|---|---|---|---|
| 4 | 5 | 6 |/|
|---|---|---|---|
| 7 | 8 | 9 | = |
|---------------|
下面是其中addEventListener
用武之地。当你调用element.addEventListener("click", func)
,只要单击element
,func
将被调用。因此,要单击时按钮添加到结果,你可以这样做:
buttons[i].addEventListener("click", addButtonValueToResult);
其中addButtonValueToResult
是按钮的值添加到结果的功能。
的问题是,不同的按钮有不同的价值观,所以像这样的功能不会为所有这些工作。因此,addButtonValueToResult
不能是一个简单的功能;每个按钮都需要自己的功能。这样的一个解决方案是沟for循环,只是这样做:
buttons[1].addEventListener("click", add1ToResult);
buttons[2].addEventListener("click", add2ToResult);
buttons[1].addEventListener("click", add3ToResult);
...
再有这样的功能:
function add1ToResult() {
result.innerHTML += "1"
}
但是这需要花费很多不必要的工作,因为你需要添加功能对于每个数字按钮(| 1 |
到| 9 |
)以及操作员按钮(| = |
,|/|
和| * |
),它们只是将innerHtml
s添加到结果中。而且,按钮的索引已经分配给一个变量i
,整个按钮可以用该索引与buttons[i]
引用。难道你不能让程序自动为每个按钮创建一个函数:当给定按钮的索引i
时,获取按钮(通过buttons[i]
)并将该按钮的值添加到结果中?
那么这正是这个程序所做的:addValue(i)
不只是添加按钮的内部值本身;它返回另一个功能,也有一些特殊按钮的测试用例,添加按钮的内部值。看看这个代码:
function addValue(i) {
return function() {
if(buttons[i].innerHTML === "÷") {
result.innerHTML += "/";
} else if (buttons[i] === "x") {
result.innerHTML += "*";
} else {
result.innerHTML += buttons[i].innerHTML;
}
}
};
说你叫addValue(3)
;这将返回一个函数,将result
中的数字3
添加到结果中。如果您拨打addValue(9)
;这将返回一个函数,将9
添加到结果中,位于result
。您可以调用函数addValue
返回,并通过(addValue(digit)()
)实际向结果添加数字。但addEventListener
不会计算评估结果;它需要一个函数,它将在稍后点击该按钮时调用。
可能的重复[JavaScript关闭如何工作?](http://stackoverflow.com/questions/111102/how-do-javascript-closures-work) – Marty