可能访问修改后的关闭问题...如何打败?

Pro*_*ool 4 javascript closures

出于某种原因,无论如何,pageNumber最终成为loopCounter循环中的最后一个值.现在我明白如果我在闭包本身直接使用loopCounter,但我不是.从下面的代码中可以看出,我在闭包中创建了一个新变量来获取loopCounter的当前值.

我只能想到的是(假设javascript将所有内容都视为引用类型)pageNumber正在引用loopCounter,所以无论我创建一个新的pageNumber有多少次,它总是指向loopCounter对象.因此,loopCounter最终得到的值将是任何pageNumber将指向的值.

我如何让它不指向loopCounter但是每次迭代创建一个新的pageNumber,它保存当前的loopCounter值?

for (var loopCounter = result.StartingPoint; loopCounter <= result.HighestPageCount; loopCounter++)
{
  ...
  var newDiv = document.createElement('div');
  ...
  //trying to remove the reference to loopCounter
  var pageNumber = loopCounter;
  newDiv.onclick = 
    function(event) 
    { //Right here ---V
      getResultUsingUrl(result.PagerPreLink + "&pageNumber=" + pageNumber);
    };

  ...
}
Run Code Online (Sandbox Code Playgroud)

感谢以下几个答案:

function createClickMethod(loopCounter, link)
{
    var pageNumber = loopCounter;

    return function(event) { getResultUsingUrl(link + "&pageNumber=" + pageNumber); };
}
Run Code Online (Sandbox Code Playgroud)

我可以像这样打电话:

newDiv.onclick = createClickMethod(loopCounter, result.PagerPreLink);
Run Code Online (Sandbox Code Playgroud)

或者,如果我想使用jQuery ...建议如下:

jQuery(newDiv).click
(
    createClickMethod(loopCounter, result.PagerPreLink)
);
Run Code Online (Sandbox Code Playgroud)

set*_*eth 9

像其他人一样,这是一个范围问题.如果不使用JS库,您可以执行以下操作:

newDiv.onclick = (function() {
    var num = loopCounter;
    return function(evt) {
        console.log( num );
    }
})();
Run Code Online (Sandbox Code Playgroud)

您只需要在值周围创建另一个闭包.


shu*_*ter 5

您不是每次都创建一个新的pageNumber.你只有一个.JavaScript中的范围不超出功能范围.你在一个函数中声明的任何"var" - 在循环中或循环外 - 的工作方式与在函数顶部声明它的方式完全相同.

http://javascript.crockford.com/code.html