<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. Golang Redis操作

    1. Redis简介 Redis是一个开源的.使用C语言编写的.支持网络交互的.可基于内存也可持久化的Key-Value数据库.   1.1 特点 支持更多数据类型 和Memcached类似,它支持存 ...

  2. tree -L n

    # tree -L 显示到目录的第二层

  3. ControlExtensionTest(二)-----CCControlSlider

    #include "../CCControlScene.h" class CCControlSliderTest : public CCControlScene { public: ...

  4. JVM Inline

    http://www.ssw.uni-linz.ac.at/Research/Papers/Wimmer08PhD/Wimmer08PhD.pdf http://www.azulsystems.com ...

  5. Maven 在eclipse中如何配置

    大部分码农们都很熟悉Eclipse,用eclipse开发项目,Maven是解决依赖库的一个非常好用的java工具,可以与Eclipse集成,方便地管理web,java项目等等:但是很多初学者都不知道怎 ...

  6. 委托事件和jquery中的delegate方法

    利用事件冒泡的特性,给父元素绑定事件,然后判断事件对象,来给父元素的每个子元素添加事件,而不是直接在所有的子元素上绑定事件: <ul> <li></li> < ...

  7. 李洪强iOS开发之-FMDB的用法

    // //  ViewController.m //  04 - FMDB的用法 // //  Created by 李洪强 on 2017/6/6. //  Copyright © 2017年 李洪 ...

  8. 几种任务调度的 Java 实现方法与比较 mark

    任务调度是指基于给定时间点,给定时间间隔或者给定执行次数自动执行任务.本文由浅入深介绍四种任务调度的 Java 实现: Timer ScheduledExecutor 开源工具包 Quartz 开源工 ...

  9. WARNING: arch/arm/mach-omap2/built-in.o(.text+0x12cdc): Section mismatch in reference from the function mmc0_init() to the (unknown reference) .init.data:(unknown)

    解决方法,找到对应的不能使用 __init 字眼的地方,删除他即可. 最后删除 296 static struct omap2_hsmmc_info am335x_mmc[] __initdata = ...

  10. Lua中的loadfile、dofile、require详解

    1.loadfile——只编译,不运行 loadfile故名思议,它只会加载文件,编译代码,不会运行文件里的代码.比如,我们有一个hellofile.lua文件: 复制代码代码如下: print(“h ...