4-5编程联系

4-5编程联系

var btns = document.getElementsByTagName('button');

for (var i = 0; i < btns.length; i++) {

(function (i) {

console.log(i)

               btns[i].onclick = function () {

alert("οnclick");

}

})(i);

}

这样写可以实现但是看不懂什么意思,在for里面并列两个()(),怎么理解

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

2回答
好帮手慕糖 2019-07-22 20:22:55

同学你好,1、这个是函数的自执行,相当于我写了个函数,然后后面的()把这个函数调用了。

2、后面调用的这个括号的值,就是传递的值,是实参,function这里的这个是形参。每循环一次,传递一次,传递的就是循环的这个值。

http://img1.sycdn.imooc.com//climg/5d35a9a5000111ce07010316.jpg

3、因为执行循环的时候,给每个绑定了,这个时候i还不全是3,但是到最后点击的时候,是已经绑定好了的,也已经循环完了,所以点击的时候,就是最后的值了。是因为是先绑定后触发的。

4、给k初始值为1时,只有按钮2和3会绑定事件,说明决定绑定事件的不是原来的i而是k

这句话不太严谨哦,传递的不一定要是k,传递i也是可以的。这个主要是由你传递的值决定的,你实参传递进去几,形参就是几。

这个是后面也会学到,同学可以先了解下哦。

祝学习愉快!

且听风吟720 2019-07-22 18:03:04
var btns = document.getElementsByTagName('button');
var k = 0;
for (var i = 0,k=1; i < btns.length,k<3; i++,k++) {
    (function (i){
        console.log(i);
        console.log('内部打印的k是'+k)
        btns[i].onclick = function(){
            alert(i+1);
        }
    })(k);
console.log('外部打印的k是'+k);
}

我试着把函数的参数换成了两个,在上面所示的代码下,控制台输出结果如下:

http://img1.sycdn.imooc.com//climg/5d35872b00014d9d06010150.jpg

我能理解出来的是,把for循环下面的最外层function用括号括起来之后,实际上传入的参数是倒数第二行的那个i(上方修改的代码里的k),紧跟着function后面的括号里的i是形参,推测原因有两条:

1.当设置k可以循环到3时,控制台会报错,但是控制台输出了i=3这一行,说明现在的i不是实参

http://img1.sycdn.imooc.com//climg/5d3589d10001eef306310134.jpg

2.给k初始值为1时,只有按钮2和3会绑定事件,说明决定绑定事件的不是原来的i而是k

这些是我的推测,也希望老师能看到给出一个更完整的回答!

问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
2.组件化网页开发
  • 参与学习           人
  • 提交作业       1121    份
  • 解答问题       14456    个

本阶段在运用JS实现动态网页开发的基础上,带你深入理解企业开发核心思想,完成一个企业级网页的开发,体验前端工程师的成就感。

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师