zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    在做nginx的服务器http错误和解决办法
    利用ffmpeg将MP4文件切成ts和m3u8
    整理:服务器命令(笔记)
    函数式编程
    Object
    promise
    前端模块化、工程化
    函数
    restful && rpc
    全局、局部变量
  • 原文地址:https://www.cnblogs.com/moli-/p/6549101.html
Copyright © 2011-2022 走看看