2

有没有办法在 jQuery 中“保存”一个变量?

我有一个 .each() 循环,它改变 sz[1] 的值并为每个值触发一个 .load() 。但是,当我将 sz[1] 放在回调函数中时,它只使用 sz[1] 的最后记录值,而不是我最初调用 .load() 时的值。

$("#Big").find("a").each(function() {
  url = $(this).attr("href");
  pattern = new RegExp("sizes/([" + sizes + "])/$");
  otherPattern = new RegExp("sizes/([" + otherSizes + "])/$");
  sz = pattern.exec(url);
  if(sz) {
    normLink(sz[1], srcBase);
  } else {
    sz = otherPattern.exec(url);
    if(sz) {
      NotOkToDeLoad++;
      $("a#" + sz[1]).load(URL + sz[1] + " div#psp", function() { fixLink(sz[1]); });
    }
  }
});

sz[1] 可以是“k”、“h”或“o”。但是,fixLink() 总是以最后一个可能的值“o”调用 3 次。

我目前的解决方法是为 sz[1] 的每个可能值编写三个单独的 .load(),但应该有更简单的方法。我忽略了什么吗?

4

4 回答 4

2

习惯于使用[MDN]使变量成为本地变量:var

var pattern = new RegExp("sizes/([" + sizes + "])/$");
var otherPattern = new RegExp("sizes/([" + otherSizes + "])/$");
var sz = pattern.exec(url);

您的问题是sz(隐式)全局的,因此循环的每次迭代都会覆盖先前的值。

尽可能避免使用全局变量。JSHint等工具会在出现隐式全局变量时发出警告。

另请注意,在循环中创建闭包时还有另一个问题。它不适用于您的情况,因为您正在使用.each()而不是正常for循环,但最好注意它。

于 2012-06-17T10:17:46.253 回答
0

可能您正在sz尝试使用var关键字进行全局变量。

于 2012-06-17T10:18:04.777 回答
0

使用闭包来保存值(仅当您不能将 sz 变量设为本地时!):

$("a#" + sz[1]).load(URL+ ...., (function(val) { return function(){ fixLink(val); } })(sz[1]));
于 2012-06-17T10:23:18.950 回答
-1

我不知道它是否有帮助,但也许您可以将所需的变量存储在与元素关联的 $.data() 变量中...您可以在此处阅读有关此的内容

于 2012-06-17T09:56:12.113 回答