检查一下代码

检查一下代码

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
	<title>变量、作用域</title>
    
</head>
<body>
	<button>1</button>
	<button>2</button>
	<button>3</button>
    <script type="text/javascript">
//     var btns = document.getElementsByTagName('button');
//          for (var i = 0; i < 3; i++) {
//             	btns[i].onclick = function () {
// 		    	alert(i + 1);
// 	    	};
// 	   }
//在此处修改代码
        var btns = document.getElementsByTagName('button');
            for (var i = 0; i < btns.length; i++) {
                btnClick(i,btns);
             };
        function btnClick(i,btns) {
            btns[i].onclick = function () {
		    	alert(i + 1);
	    	};
 	   }
    </script>
</body>
</html>

1、传两个参数的写法是不是不好,还是只是传一个参数i写法好?

2、能解释一下第一段代码每次点击都是4吗?原理是什么?for的作用机制是什么?好像是执行完for循环才会执行点击事件

正在回答

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

2回答

同学你好,可以这么说,但是准确的说,不是重新写了3个事件。而且开辟了3个作用域。

每循环一次就调用一次函数, 在函数的作用域中会保存当前的i值, 所以每次点击的时候, 向上查找作用域就是找到函数中保存的不同的i值。

希望能帮助到你,祝学习愉快!

好帮手慕糖 2019-09-15 11:18:49

同学你好,1、实现效果很好。两个参数也是可以的哦,这样若是有其他元素调用的话,传递对应的元素即可。

2、是的哦,是循环完才执行的点击事件。

(1)for的机制,就是先执行var i= 0;初始化,然后判断i<btns.length;若是i小于的话,符合条件执行里面的内容。然后执行i++;i加之后,在进行判断。然后符合在继续执行里面的内容。不符合结束循环。

(2)其实这两主要是因为先绑定后触发。

在循环的时候给每个元素绑定了事件。但是这个事件是需要在点击的时候才触发的。没有点击不触发。在点击的时候,循环已经结束了,所以i的值就是循环结束之后的值。

希望能帮助到你,欢迎采纳。

祝学习愉快!

  • (2)中的意思是说,JS中的for循环代码其实是给每个btns[i]都绑定了点击事件,但是输出alert是在按钮被点击后,这时循环已经结束了,i只能是最后的值。 那下面的代码for循环3次,相当于重新写了3个btnClick事件,所以会有对应的i值了对吗?
    2019-09-15 16:29:32
问题已解决,确定采纳
还有疑问,暂不采纳

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

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

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

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

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

在线咨询

领取优惠

免费试听

领取大纲

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