javascript - 这个alert出underfined?
高洛峰
高洛峰 2017-04-11 12:46:24
[JavaScript讨论组]

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全部回复(4)
PHP中文网

js中没有块级作用域,例如for,if等,所以每次循环i的值都不会保留下来。

执行到最后,i=arr.length + 1,数组最大的index为arr.length -1,所以为undefined。

解决方法:
JS没有块级作用域,但有函数作用域,所以可以用立即执行函数,将每次的i传递进入函数作用域。如下面所写。


第一种方法:只修改for循环语句中的var为let

for(let i = 0; i < arr.length; i++){
    arr[i].onclick = function(){
      alert(i);
    }
}

第二种方法:自执行函数

for(var i = 0; i < arr.length; i++){
  function(k){
    arr[k].onclick = function(){
      alert(k);
    }
  }(i)
}

第三种方法:同第二种方法一样,使用自执行函数

for(var i = 0; i < arr.length; i++){
    arr[i].onclick = (function(k){
      alert(k);
    }
  })(i)
}
PHP中文网

由于js异步机制,这个alert中的i参数会是循环结束之后的值,循环结束之后,i的值比add的长度大1,所以这个索引对应的项为undefined

大家讲道理

基础闭包问题。

for(let i = 0; i < arr.length; i++){
  function(index){
    arr[index].onclick = function(){
      alert(index);
    }
  }(i)
}
大家讲道理

自执行函数里边你没有给他传递参数,如果不传参数每次闭包里查找到的i值都是循环完的i值。i为循环完后的最大值,实际上i找不到这个选项所以为undefined。

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

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