|
发表于 2022-3-31 12:42:39
|
显示全部楼层
如问题代码:
- <script>
- var div=document.getElementById('main').getElementsByTagName('div');
- var li=document.getElementsByTagName('li');
- for(var k=0; k<li.length; k++){
- li[k].onclick=function(){
- console.log(k);
- }
- }
- </script>
复制代码
再次回复你之前说的function中调用 i 出错的问题。更正这里的 i 变量 问题不是作用域问题 ,而是 代码形成了闭包,闭包中局部变量是引用而非值
解析问题代码:
1. 首先闭包中局部变量是引用,也就是说 console.log(k); 中的 k 是个地址,而不是值。
2. script代码在页面加载便执行。
3. 经过一轮 for(var k=0; k<li.length; k++) 后 k 最后的值是 k==li.length,k超出了数组下标。
4. 当进行点击li测试时,所有的onclick函数中的k其实是个地址,值k==li.lenght。在你原代码中 i,i超出数组下标,报错。
3种解决办法:
1. 标记法
- <script>
- var div=document.getElementById('main').getElementsByTagName('div');
- var li=document.getElementsByTagName('li');
- for(var k=0; k<li.length; k++){
- li[k].flag = k; // 添加flag用于存储 k 的值
- li[k].onclick=function(){
- console.log(this.flag);
- }
- }
- </script>
复制代码
2.
- <script>
- var div=document.getElementById('main').getElementsByTagName('div');
- var li=document.getElementsByTagName('li');
- for(var k=0; k<li.length; k++){
- li[k].onclick=(function(j){
- return function(){
- console.log(j);
- }
- })(k);
- }
- </script>
复制代码
3.
- <script>
- var div=document.getElementById('main').getElementsByTagName('div');
- var li=document.getElementsByTagName('li');
- for(var k=0; k<li.length; k++){
- (function(j){
- li[k].onclick= function(){
- console.log(j);
- }
- })(k);
- }
- </script>
复制代码
测试代码:
|
|