如何控制变量吊装
How To Control Variable Hoisting?
本文关键字:控制变量 更新时间:2023-09-26
我有一个问题,从一个数组绑定函数到一些元素,但我得到这个错误后,我点击任何元素类"class"。
Uncaught TypeError: object function (){alert(1)},function (){alert(2)},function (){alert(3)},function (){alert(4)}的属性'4'不是一个函数
var c = [
function(){alert(1)},
function(){alert(2)},
function(){alert(3)},
function(){alert(4)}
];
function test(b){
for(var i = 0; i < b.length; i++){
$('.class').eq(i).bind('click', function(){
b[i]();
});
}
}
test(c);
我认为变量I保持它的上一个值
任何解决方案或解释将非常感激。
你需要一个闭包——在js中变量的作用域是由函数决定的。使用jQuery,只需使用.each
:
$('.class').each(function(i) {
$(this).on('click', function(){
alert(i+1);
});
});
但是,如果你真的需要一个不同函数的数组,你可以直接将函数本身绑定为处理程序:
var elems = $('.class');
for (var i=0;i<b.length;i++) {
elems.eq(i).on('click', b[i]);
}
你的函数数组只有4项,所以b[4]
是未定义的。而不是在点击处理程序中引用b
,使其成为点击处理程序本身:
elems.eq(i).on('click', b[i]);
通过这样做,i
的值将在循环的每次迭代中检查,而不是在单击元素时检查(此时其值应该始终是4
)。
问题是,在您的循环中,您设置为click
处理程序的函数都共享相同的i
值。循环后,i
的值将变为4
,因此每个函数将尝试调用不存在的b[4]
。
您需要为每个函数创建一个新的作用域,以便i
值都是不同的。
for(var i = 0; i < b.length; i++){
(function(i){
$('.class').eq(i).bind('click', function(){
b[i]();
});
}(i));
}
您也可以直接将数组中的函数设置为click
处理程序。
for(var i = 0; i < b.length; i++){
$('.class').eq(i).bind('click', b[i]);
}
相关文章:
- 为什么可以't我将检索到的文档分配给控制台中的变量
- 在控制台中显示下划线变量
- 自定义指令模板中的AngularJS控制变量
- 在Firebug控制台中监视javascript命名空间变量
- 把手助手(Emberjs)中的访问控制变量
- 如何控制不同计数器中的一个变量
- 控制变量范围
- 需要 jQuery 到 Tampermonkey 脚本和控制台中的安全变量
- jQuery在控制台中工作.log但不在变量中工作
- d3.js变量未定义,但在Firefox控制台中,它可以工作
- 在控制台中列出正在运行的控制器实例及其 this 变量
- 为什么循环控制变量没有在当前值处传递给回调函数
- 检查不存在的变量时控制流模式
- 在具有递增的变量/对象中存储和控制传单 GeoJSON 图层
- Adobe edge:使用全局 JavaScript 变量来控制活动内容
- 变量在控制台中更新.log但不在其他函数中更新
- 使用变量控制事件
- 带有滑块的控制变量
- 如何控制变量吊装
- 如何在NodeJS中控制变量的并发访问