有没有办法在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”。但是,总是使用最后一个可能的值“o”调用fixLink()三次。
我目前的解决方法是为sz [1]的每个可能值写三个单独的.load(),但应该有一个更简单的方法。我忽略了什么吗?
答案 0 :(得分:2)
使用var
[MDN]:
var pattern = new RegExp("sizes/([" + sizes + "])/$");
var otherPattern = new RegExp("sizes/([" + otherSizes + "])/$");
var sz = pattern.exec(url);
您的问题是sz
(隐含地)全局,因此循环的每次迭代都会覆盖之前的值。
尽可能避免使用全局变量。像JSHint这样的工具会在隐式全局变量的情况下发出警告。
另请注意there is another problem when creating closures in a loop。它不适用于您的情况,因为您使用的是.each()
而不是正常的for
循环,但最好注意它。
答案 1 :(得分:0)
您可能正在使用sz
关键字进行全局变量var
。
答案 2 :(得分:0)
使用闭包来节省价值(仅当你不能将sz变量设为本地时!):
$("a#" + sz[1]).load(URL+ ...., (function(val) { return function(){ fixLink(val); } })(sz[1]));
答案 3 :(得分:-1)
我不知道它是否可以提供帮助,但也许您可以将所需的变量存储在与该元素关联的$ .data()变量中...您可以阅读有关此here <的内容/ p>