好的,我确定这是一个非常简单的问题,但我发现的其他答案对我来说有点太复杂了。我想创建一系列按钮,每个按钮都会发送它创建的循环迭代的警报。但是,每个按钮都会发送一个“5”的警报,循环结束后i的值。如何复制i而不是访问实际值?这是通过价值还是参考?
<span id="buttons"></span>
<script>
var buttons = document.getElementById("buttons");
for (var i = 0; i < 5; i++) {
var btn = document.createElement("button");
btn.onclick = function(){alert(i);}
btn.innerHTML = "Button " + i;
buttons.appendChild(btn);
}
</script>
答案 0 :(得分:2)
这是因为你在(function() {
'use strict';
var idsBlacklist = [
"1010101"
];
var query = "a:contains('Click Me')";
var TargetLink = $(query).filter(function () {
var id = this.href.split('/').slice(-1)[0];
return idsBlacklist.indexOf(id) < 0;
});
var blackListed = $(query).filter(function () {
var id = this.href.split('/').slice(-1)[0];
return idsBlacklist.indexOf(id) >= 0;
});
if (!blackListed.length && TargetLink.length) {
console.log(TargetLink[0].href);
//window.location.href = TargetLink[0].href;
}
})();
变量周围有一个闭包,它在你在里面使用它的函数之外声明。
关闭可能难以理解,您可以详细了解它们 here 。
将变量声明更改为使用<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<a href="/ID/1010101">Click Me</a>
<a href="/ID/1010102">Click Me</a>
<a href="/ID/1010103">Click Me</a>
而不是i
,以便每次循环迭代都会获得自己的let
作用域。
var
答案 1 :(得分:2)
一个选项是将事件处理程序包装在IIFE中(立即调用的函数表达式)。
这样做,您在每次迭代时捕获并传递if (bird.getPosition().y <= ground.getHeight()){
gsm.set(new GameOverState(gsm));
l = k;
}
的值。
func drawPDFUsingPrintPageRenderer(printPageRenderer: UIPrintPageRenderer) -> NSData! {
let data = NSMutableData()
UIGraphicsBeginPDFContextToData(data, CGRect.zero, nil)
printPageRenderer.prepare(forDrawingPages: NSMakeRange(0, printPageRenderer.numberOfPages))
let bounds = UIGraphicsGetPDFContextBounds()
for i in 0...(printPageRenderer.numberOfPages - 1) {
UIGraphicsBeginPDFPage()
printPageRenderer.drawPage(at: i, in: bounds)
}
UIGraphicsEndPDFContext();
return data
}
另一种选择是使用bind()
method在每次迭代时传递i
的值:
(function (i) {
btn.onclick = function() {
alert(i);
}
})(i);
但是,更好的选择可能是在每次迭代的元素上设置i
属性,然后在事件监听器中,您可以访问该元素的数据属性:
btn.onclick = function(index) {
alert(index);
}.bind(null, i);