Javascript JQuery';s单击事件并在其中使用全局变量? for(变量i=0;i

Javascript JQuery';s单击事件并在其中使用全局变量? for(变量i=0;i,javascript,jquery,html,Javascript,Jquery,Html,当我单击我的图像时,我在控制台中等待测试:0、测试:1、测试:2…,但只有:“test:8”消息。为什么它是这样工作的? 如何保存i变量的当前值?我需要它来做这样的事情: for ( var i = 0; i < 8; i++ ) { $( "#image" + i ).click( function() { console.log( "test: " + i ); } ); } for(变量i=0;i

当我单击我的图像时,我在控制台中等待测试:0、测试:1、测试:2…,但只有:“test:8”消息。为什么它是这样工作的? 如何保存i变量的当前值?我需要它来做这样的事情:

for ( var i = 0; i < 8; i++ ) {
    $( "#image" + i ).click( function() {
        console.log( "test: " + i );
    } );
}
for(变量i=0;i<8;i++){
$(“#图像”+i)。单击(函数(){
$(“#anotherImage”+i).css(“不透明度”,“0.5”);
} );
}

我有8个ID为:anotherImage0,anotherImage1,…,anotherImage7:)

这是因为
I
的作用域不是仅限于循环块,而是全局或其父函数。一旦你的循环完成,它的值就是它增加的总次数。为了实施您想要实现的块范围,您可以使用ES6的变量分配:

for(设i=0;i<8;i++){
$(“#图像”+i)。单击(函数(){
控制台日志(“测试:+i”);
});
}

这是因为
i
的作用域不是仅限于循环块,而是全局或其父函数。一旦你的循环完成,它的值就是它增加的总次数。为了实施您想要实现的块范围,您可以使用ES6的变量分配:

for(设i=0;i<8;i++){
$(“#图像”+i)。单击(函数(){
控制台日志(“测试:+i”);
});
}

JS中的函数记住它们的环境,这就是为什么JS中的所有函数都是闭包

for ( var i = 0; i < 8; i++ ) {
    $( "#image" + i ).click( function() {
        $( "#anotherImage" + i ).css( "opacity", "0.5" );
    } );
}
for(变量i=0;i<8;i++){
(函数(index){//now index变量将是正确的,因为它们被传递到每个函数,而不是共享相同的i
$(“#图像”+索引)。单击(函数(){
控制台日志(“测试:+索引);
} );
})(i) );
}

PS:如果ES6的使用没有问题,那么请尝试另一个答案,并建议在JS中使用let

函数记住它们的环境,这就是为什么JS中的所有函数都是闭包

for ( var i = 0; i < 8; i++ ) {
    $( "#image" + i ).click( function() {
        $( "#anotherImage" + i ).css( "opacity", "0.5" );
    } );
}
for(变量i=0;i<8;i++){
(函数(index){//now index变量将是正确的,因为它们被传递到每个函数,而不是共享相同的i
$(“#图像”+索引)。单击(函数(){
控制台日志(“测试:+索引);
} );
})(i) );
}

PS:如果ES6的使用没有问题,那么请尝试其他答案,并建议使用let

好答案!但是“相反,它具有全局范围。”只要我们没有看到完整的代码,我们就不能确定变量的范围。我们只能知道函数共享相同的范围。在这种情况下,变量提升是如何相关的?啊,很好的捕捉!修改我的解释以反映这一点。很好看,回答得很好!但是“相反,它具有全局范围。”只要我们没有看到完整的代码,我们就不能确定变量的范围。我们只能知道函数共享相同的范围。在这种情况下,变量提升是如何相关的?啊,很好的捕捉!修改我的解释以反映这一点。很好看。