我正在创建一个很长的选择项列表,并希望创建一个闭包调用来添加每个选项,然后对调用进行排队(通过setTimer),这样浏览器就不会挂起。
我的实现效果很好,但这让我感到困惑,以下代码:
var mainList = $('#mainList');
for (var i=0;i < 100000; i++) {
var self = mainList, addOption = function() {
$(self).append('<option value=' + i + '>' + i + '</option>');
};
$.queue.add(addOption, this);
}
产生
<option value='100000'>100000</option>
<option value='100000'>100000</option>
<option value='100000'>100000</option> etc...
我想让它生成选项:
<option value='1'>1</option>
<option value='2'>2</option>
<option value='3'>3</option> etc...
我正在努力解决关闭的执行方式,当i == 100000时调用addOption()方法是有意义的,但我希望调用在排队时反映i的值
我在这里有一个简单的伎俩吗?
答案 0 :(得分:2)
在引入Function.prototype.bind之前,肯定有必要使用一个专门用于在这种情况下捕获一个或多个变量的闭包。
现在,这种方法被认为有点笨拙。
你可以定义一个基本的addOption
函数,然后在循环中生成它的版本,使用addOption.bind()
在mainList
中绑定为&#34; thisArg&#34;和i
作为第一个正式变量:
var mainList = $('#mainList');
var addOption = function(i) {
this.append('<option value=' + i + '>' + i + '</option>');
};
for (var i=0; i<100000; i++) {
$.queue.add(addOption.bind(mainList, i), this);
}