javascript - js中的作用域的问题
迷茫
迷茫 2017-04-10 18:09:26
[JavaScript讨论组]

var btns = document.querySelectorAll('.btn'); // 6 elements
var output = document.querySelector('#output');
var events = [1, 2, 3, 4, 5, 6];

// Case 1
for (var i = 0; i < btns.length; i++) {
btns[i].onclick = function(evt) {

output.innerText += 'Clicked ' + events[i];

};
}

// Case 2
for (var i = 0; i < btns.length; i++) {
btns[i].onclick = (function(index) {

return function(evt) {
  output.innerText += 'Clicked ' + events[index];
};

})(i);
}

// Case 3
for (var i = 0; i < btns.length; i++) {
btns[i].onclick = (function(event) {

return function(evt) {
  output.innerText += 'Clicked ' + event;
};

})(events[i]);
}

为何case1那里的绑定方法是错误的?

迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

全部回复(3)
巴扎黑

因为当你click的时候i已经是 btns.length 了,这跟js的闭包有关系,建议你了解一下。

解决办法有很多种,常见的有如下三种办法(建议你了解完闭包之后再回来看):

//1.  最简单的方法  将变量 i 保存给在每个btns对象上
    for (var i = 0; i < btns.length; i++) {
        btns[i].index = i;
        btns[i].onclick = function(evt){
            output.innerText += 'Clicked ' + events[this.index];
        }
    }
//2.  将变量 i 保存在匿名函数自身
        for (var i = 0; i < btns.length; i++) {
            (btns[i].onclick = function(evt){
                output.innerText += 'Clicked ' + events[arguments.callee.i];
            }).i = i;
        }

//3.  加一层闭包,i 以局部变量形式传递给内层函数
        for (var i = 0; i < btns.length; i++) {
            (function(){
                var temp = i;
                btns[i].onclick = function(evt){
                    output.innerText += 'Clicked ' + events[temp];
                }
            })();
        }
ringa_lee

请了解js闭包

PHPz

js闭包相关,找下相关的文章或者书籍看看

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号