可能访问修改后的关闭问题...如何击败? [英] Possible Access To Modified Closure Issue... How To Beat?

查看:59
本文介绍了可能访问修改后的关闭问题...如何击败?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

For some reason no matter what, the pageNumber ends up being the last value in the loop for the loopCounter. Now I would understand that if I were directly using loopCounter in the closure itself, but I'm not. As you can see from the code below, I am creating a new variable within the closure to take the current value of loopCounter.

我唯一能想到的是(假设javascript将所有内容都视为引用类型),pageNumber会引用loopCounter,所以无论我创建一个新的对象多少次pageNumber,它始终指向loopCounter对象。因此,无论loopCounter最终得到的值是什么pageNumber指向的值。

Only thing I can figure is (Assuming that javascript treats everything as a reference type) that pageNumber is taking the reference to loopCounter so no matter how many times I create a new pageNumber, it's always pointing at the loopCounter object. Therefore, whatever value loopCounter ends up with will be the value any pageNumber will point to.

如何使它不指向loopCounter而是在每次迭代时创建一个新的pageNumber保持当前loopCounter值?

How do I get it to not point at loopCounter but create a new pageNumber per iteration that holds the current loopCounter value?

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);
    };

  ...
}

解决方案

感谢以下几个答案:

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

    return function(event) { getResultUsingUrl(link + "&pageNumber=" + pageNumber); };
}

我可以这样称呼:

newDiv.onclick = createClickMethod(loopCounter, result.PagerPreLink);

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

Or if I want to use jQuery... suggested below:

jQuery(newDiv).click
(
    createClickMethod(loopCounter, result.PagerPreLink)
);


推荐答案

就像其他所有人一样,这是一个范围界定问题。无需使用JS库,您可以执行以下操作:

Like everyone else said, it's a scoping problem. Without using a JS library, you can do something like this:

newDiv.onclick = (function() {
    var num = loopCounter;
    return function(evt) {
        console.log( num );
    }
})();

您只需要在值周围创建另一个闭包即可。

You just need to create another closure around the value.

这篇关于可能访问修改后的关闭问题...如何击败?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆