JavaScript ES2015
<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的更多相关文章
- 【15】ES6 for Humans: The Latest Standard of JavaScript: ES2015 and Beyond
[15]ES6 for Humans 共148页: 目前看到:已经全部阅读. 亚马逊地址: 魔芋:总结: 我先看的是阮一峰的在线书籍.这本书的内容很多都与之重复的. 居然卖¥463.也是没谁了. ...
- JavaScript es2015经验基础总结
一.作用域 var和es6中的let 的区别. 1.var 是JavaScript中定义全局变量的关键字 2.let 是es6语法中定义变量的关键字 但是let的变量是块级作用域(只能在自己的块里面使 ...
- 你需要知道的 JavaScript 类(class)的这些知识
作者: Dmitri Pavlutin译者:前端小智来源:dmitripavlutin 点赞再看,养成习惯 本文 GitHub https://github.com/qq44924588... 上已经 ...
- chrome49 新特性 chrome.org转载
Transitioning from SPDY to HTTP/2 Thursday, February 11, 2016 Last year we announced our intent to e ...
- Angular vs React 最全面深入对比
如今,Angular和React这两个JavaScript框架可谓红的发紫,同时针对这两个框架的选择变成了当下最容易被问及或者被架构设计者考虑的问题,本文或许无法告诉你哪个框架更优秀,但尽量从更多的角 ...
- 创建一个离线优先,数据驱动的渐进式 Web 应用程序
原文地址:Build an offline-first, data-driven PWA 译文出自:我的个人博客 概述 在本文中,您将学习如何使用 Workbox 和 IndexedDB 创建离线优先 ...
- 最好的前端API备忘单整理
注:这份表引自The best front-end hacking cheatsheets - all in one place Javascript ES2015 Cheatsheet JavaSc ...
- angular6 NgModule中定义模块module
用这个@NgModule()这个decorator ,放在一个class的上面,这个class一个一个module了 @NgModule() 里面的参数是一个对象,用来配置的,声明这个module里面 ...
- Shared——The best front-end hacking cheatsheets — all in one place.
原文地址:https://medium.freecodecamp.org/modern-frontend-hacking-cheatsheets-df9c2566c72a The best front ...
随机推荐
- 进程的处理器亲和性和 vCPU 的绑定(查看cpu信息,超线程等)
通常情况下,在 SMP 系统中,Linux 内核的进程调度器根据自有的调度策略将系统中的一个进程调度到某个 CPU 上执行.一个进程在前一个执行时间是在 cpuM(M 为系统中的某 CPU 的 ID) ...
- SICP-Exercise 1.5
Exercise 1.5. Ben Bitdiddle has invented a test to determine whether the interpreterhe is faced wit ...
- Angular External js library calling Document.Ready
https://stackoverflow.com/questions/51094841/angular-external-js-library-calling-document-ready Step ...
- Xcode真机调试iOS10中Nslog 打印不出东西
Xcode真机调试iOS10中Nslog 打印不出东西 解决方案 通过以下途径找到 Product->Scheme->EditScheme ios9以前的 如果不加 1 的那句 在xcod ...
- Java IP地址字符串与BigInteger的转换, 支持IPv6
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 3 ...
- . net 源代码调试
对于 .net framework 中的代码,光拿 Reflector 看是不够过瘾的,如果能够调试进去就好了! 其实,微软是提供了一套 sourcecode 的下载的: http://referen ...
- PeekMessage、GetMessage的区别
在Windows编程中经常使用这两个函数来处理消息,它们之间的区别就是GetMessage是阻塞的,PeekMessage是非阻塞的. GetMessage原型如下:BOOL GetMessage(L ...
- 字符编码的故事:ASCII,GB2312,Unicode,UTF-8,UTF-16
http://blog.csdn.net/longintchar/article/details/51079340 ****************************************** ...
- CSS里有哪些常见的块级元素和行内元素以及其区别?
根据CSS规范的规定,每一个网页元素都有一个display属性,用于确定该元素的类型,每一个元素都有默认的display属性值,比如div元素,它的默认display属性值为“block”,成为“块级 ...
- 知乎:在卡内基梅隆大学 (Carnegie Mellon University) 就读是怎样一番体验?
转自:http://www.zhihu.com/question/24295398 知乎 Yu Zhang 知乎搜索 首页 话题 发现 消息 调查类问题名校就读体验修改 在卡内基梅隆大学 (Car ...