<button>一</button>
<button>二</button>
<button>三</button>
<button>四</button> <div id="output"></div> <script>
var buttons = document.querySelectorAll('button')
var output = document.querySelector('#output') for (var i = 0; i < buttons.length; i++) {
buttons[i].addEventListener('click', function() {
output.innerText = buttons[i].innerText
})
}
</script>
从直观角度看 这段代码没有语义上的错误,但是当我们点击任意一个按钮时,就会报出这样的错误信息:

Uncaught TypeError: Cannot read property 'innerText' of undefined

出现这个错误的原因是因为button[i]不存在,即为undefined

每次我们点击按钮时,事件监听回调函数中得到的变量i都会等于button.length,也就是4 而button[4]恰恰不存在,所以导致错误发生

导致i得到的值都是button.length的原因是因为JavaScript中没有块儿级作用域,而使对i的变量引用(Reference)一直保持在上一层作用域(循环语句所在层)上,而当循环结束时i正好是buttons.length

做一个小改动如下:

// ...
for (/* var */ let i = 0; i < buttons.length; i++) {
// ...
}
// ...

通过 把for语句中对计数器i的定义语句从var换成let ,因为let语句会使该变量处于一个块儿级作用域中,从而让事件监听回调函数中的变量引用得到保持,

  出现这个错误的原因是因为button[i] 不存在,即为undefined

JavaScript ES2015的更多相关文章

  1. 【15】ES6 for Humans: The Latest Standard of JavaScript: ES2015 and Beyond

    [15]ES6 for Humans 共148页: 目前看到:已经全部阅读.   亚马逊地址: 魔芋:总结: 我先看的是阮一峰的在线书籍.这本书的内容很多都与之重复的. 居然卖¥463.也是没谁了. ...

  2. JavaScript es2015经验基础总结

    一.作用域 var和es6中的let 的区别. 1.var 是JavaScript中定义全局变量的关键字 2.let 是es6语法中定义变量的关键字 但是let的变量是块级作用域(只能在自己的块里面使 ...

  3. 你需要知道的 JavaScript 类(class)的这些知识

    作者: Dmitri Pavlutin译者:前端小智来源:dmitripavlutin 点赞再看,养成习惯 本文 GitHub https://github.com/qq44924588... 上已经 ...

  4. chrome49 新特性 chrome.org转载

    Transitioning from SPDY to HTTP/2 Thursday, February 11, 2016 Last year we announced our intent to e ...

  5. Angular vs React 最全面深入对比

    如今,Angular和React这两个JavaScript框架可谓红的发紫,同时针对这两个框架的选择变成了当下最容易被问及或者被架构设计者考虑的问题,本文或许无法告诉你哪个框架更优秀,但尽量从更多的角 ...

  6. 创建一个离线优先,数据驱动的渐进式 Web 应用程序

    原文地址:Build an offline-first, data-driven PWA 译文出自:我的个人博客 概述 在本文中,您将学习如何使用 Workbox 和 IndexedDB 创建离线优先 ...

  7. 最好的前端API备忘单整理

    注:这份表引自The best front-end hacking cheatsheets - all in one place Javascript ES2015 Cheatsheet JavaSc ...

  8. angular6 NgModule中定义模块module

    用这个@NgModule()这个decorator ,放在一个class的上面,这个class一个一个module了 @NgModule() 里面的参数是一个对象,用来配置的,声明这个module里面 ...

  9. Shared——The best front-end hacking cheatsheets — all in one place.

    原文地址:https://medium.freecodecamp.org/modern-frontend-hacking-cheatsheets-df9c2566c72a The best front ...

随机推荐

  1. linux服务器文件删除空间却未释放

    在Linux或者Unix系统中,通过rm或者文件管理器删除文件将会从文件系统的目录结构上解除链接(unlink),然而如果文件是被打开的(有一个进程正在使用),那么进程将仍然可以读取该文件,磁盘空间也 ...

  2. JSP版LCX:端口转发神器 KPortTran

    最近接触内网很多,渗透过程中,由于windows和linux的差别以及运行语言环境的限制导致端口转发经常出现问题.于是自己写了个简单的JSP的端口转发脚本.仿造LCX的功能,具有正向.反向.监听三种模 ...

  3. C++范围解析运算符::的使用

    1.范围解析运算符的作用范围解析运算符 :: 用于标识不同范围内使用的标识符. 2.范围解析运算符的使用1)用于命名空间和类 namespace NamespaceA{ int x; class Cl ...

  4. mysql linux 区分大小写

    查看大小写区分 mysql> show variables like "%case%"; +------------------------+-------+ | Varia ...

  5. 关于HTML、XHTML、CSS、XML的区别

    1.HTML(Hyper Text Mark-up Language) HTML(Hyper Text Mark-up Language)即超文本标记语言或超文本链接标示语言,是为“网页创建和其他可在 ...

  6. egret请求参数

    egret的文档还不错,不过http请求参数的文档居然没有,于是自己摸索了一下, 发现原来是直接传字符串参数就可以了.于是封装了一个类,方便使用. class RequestParam { publi ...

  7. 【WPF】获取下拉列表(ComboBox)的选项(ComboBoxItem)的内容

    需求:给下拉列表ComboBox注册一个选项改变时触发的事件,想要获取到当前选中的选项的内容. // 给ComboBox注册一个选项改变的事件 myComboxBox.SelectionChanged ...

  8. 在WMware新建一个虚拟机

  9. BusyBox编译配置

    1.  下载Busybox tar包,如busybox-1.23.0.tar.bz2. 官网:http://www.busybox.net/ 2.   make distclean:清除原有配置 ma ...

  10. 用户数据验证的正确姿势之assert

    用户数据验证灰常重要, 不用多说了, 但是实现方法(准确的说是表现形式)有很多人, 如何优雅的完成一个后端验证过滤器是一个值得考量的问题, 我尝试过许多方法, 比如validator.js模块, ex ...