复制变量javascript

时间:2017-01-29 21:15:26

标签: javascript jquery reference

好的,我确定这是一个非常简单的问题,但我发现的其他答案对我来说有点太复杂了。我想创建一系列按钮,每个按钮都会发送它创建的循环迭代的警报。但是,每个按钮都会发送一个“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>

JSFiddle

2 个答案:

答案 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; } 的值。

Updated Example

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的值:

Updated Example

(function (i) {
  btn.onclick = function() {
    alert(i);
  }
})(i);

但是,更好的选择可能是在每次迭代的元素上设置i属性,然后在事件监听器中,您可以访问该元素的数据属性:

Updated Example

btn.onclick = function(index) {
  alert(index);
}.bind(null, i);