在这种情况下,您只需要一个功能:
for ( var j = 0; j < checkz.length; j++ ) {
var self = checkz[j];
self.onchange = changeFunction;
// Or replace the above two lines with:
// checkz[j].onchange = changeFunction;
// ...if you don't need `self` for anything else.
}
function changeFunction() {
for ( var z = 0; z < psswrd.length; z++ ) {
psswrd[z].type = this.checked ? 'text' : 'password';
// ^^^^--- note this changed from `self` to `this`
}
}
无论如何,您都需要self
=>this
更改,因为就像最初一样,所有函数都将引用相同的self
. 当您创建一个函数时,它在创建它的上下文中具有对变量的持久引用,而不是创建它时它们的值的副本。(更多:闭包并不复杂)在这种情况下,我们可以使用this
,因为在以这种方式(和大多数方式)连接的事件处理程序中,this
将是事件处理程序连接到的元素。
现在在一般情况下,有时您需要引用循环中正在更改的内容并且您碰巧没有方便的替换,您通常会使用返回要使用的函数的构建器函数,就像这样:
for ( var j = 0; j < checkz.length; j++ ) {
var self = checkz[j];
self.onchange = buildChangeFunction(j);
}
function buildChangeFunction(jarg) {
return function() {
// Use jarg in here...
};
}
这样,我们分配给的函数将onchange
关闭buildChangeFunction
, not的参数j
,并且该参数不会改变。
但同样,您在这里不需要,上面的第一个解决方案就是您所需要的。