美文网首页
ES 6变量

ES 6变量

作者: ImmortalSummer | 来源:发表于2020-02-05 15:36 被阅读0次

ECMAScript 是JavaScript的标准, JavaScript是ES的实现. ES6的正式名称是ES2015, 是ECMA标准的第6版

ES 6 新增 let 和const

对比原有变量声明的关键字 var
var : 变量, 可重复定义, 函数级作用域
let : 变量, 不可重复定义, 块级作用域
const : 常量, 不可重复定义, 块级作用域

let不可重复定义同名变量带来的好处是,在大型项目中,减少因为命名重复而导致的错误, 这样的错误往往很难排查. let是完全可以替代var的存在

            var a = 1
            var a = 2       //不报错
            alert(a)

            let b = 1
            // let b = 2    //报错
            alert(b)

            const c = 1
            // const c = 2  //报错
            // c = 3        //报错
            alert(c)

let对比var的另一个优势, 是let是块级作用域, 而var是函数级作用域. 在java等严格的语法中, 变量都是块作用域级别的, 这样的变量, 只在一个代码块内({}大括号内) 有效, 但是js中的var 确实函数级别作用域的, 一个变量的作用域会在整个函数中. 这带来了很多麻烦
看以下代码:

<body>
    <input type="button" class="testBtn" value="0">
    <input type="button" class="testBtn" value="1">
    <input type="button" class="testBtn" value="2">
    <script>
        window.onload = function(){

            let btns = document.getElementsByClassName("testBtn");
            for(var i=0; i<btns.length; i++){
                btns[i].onclick = function(){
                    alert(i)
                }
            }
    </script>
</body>

为三个按钮添加点击事件, 点击按钮, 我们理想的情况是第一个按钮弹出0, 第二个按钮弹出1,第三个按钮弹出2, 运行结果是, 三个按钮点击弹出的都是3.
这是由于var 是函数级别作用域的变量, 他在整个函数中有效, 而不是在for循环的代码块中. 这样每次点击, 带出的i都是最后for循环完成后(结果是3)的结果.

为了修正整个作用域问题, 我们之前的做法是, 将for循环中加入新的函数, 用形参将i值传入, 每次for循环,创建一个函数, 以改变传入的i值的作用域
代码如下:

<body>
    <input type="button" class="testBtn" value="0">
    <input type="button" class="testBtn" value="1">
    <input type="button" class="testBtn" value="2">
    <script>
        window.onload = function(){

            let btns = document.getElementsByClassName("testBtn");
            for(var i=0; i<btns.length; i++){
                (function(i){
                    btns[i].onclick = function(){
                    alert(i)
                    }
                })(i)
            }
    </script>
</body>

但是, 如果像java这样的严格语法的语言中, 存在块级作用域的变量, 就根本不会存在这样的问题, 我们可以let代替var来更简单的解决这个问题

<body>
    <input type="button" class="testBtn" value="0">
    <input type="button" class="testBtn" value="1">
    <input type="button" class="testBtn" value="2">
    <script>
        window.onload = function(){

            let btns = document.getElementsByClassName("testBtn");
            for(let i=0; i<btns.length; i++){
                btns[i].onclick = function(){
                    alert(i)
                }
            }
    </script>
</body>

相关文章

  • ES6语法

    ES6语法 1.ES5和ES6声明变量的方式对比 ES5中声明变量的方式: ES6中声明变量的方式: 2. var...

  • es6重点介绍

    ES6 的变量声明 ES6 中新增了 let 和 const 来定义变量: var:ES5 和 ES6中,定义全局...

  • ES6语法

    1.ES5和ES6声明变量的方式对比 ES5中声明变量的方式: ES6中声明变量的方式: 2.var ,let,c...

  • 16-JavaScript-ES6语法

    ES6常量和变量关键字 ES6定义变量 注意点:ES6开始新增了一种作用域, 叫做代码块通过let定义的变量受到代...

  • ES6常变量关键字

    ES6之前如何定义变量 可以重复定义变量,会覆盖 会对变量进行预解析 ES6之后如何定义变量 不允许重定义变量 没...

  • ES6 笔记(常量&&变量)

    ES6 笔记(常量&&变量) 变量&&常量 新特性 ES6 新增了let命令,用来声明变量。它的用法类似于var,...

  • js 变量提升(3)

    ### ES6中let创建的变量不存在变量提升 /* * 在ES6中基于let或者CONST等方式创建变量或者函数...

  • ECMAScript6--let、const

    在es6之前用var定义变量。es6中新增了let、const 变量声明提升 所谓变量声明提升指的是,用var定义...

  • 『ES6脚丫系列』let+const+变量+变量作用域+块作用域

    『ES6脚丫系列』let+const+变量+变量作用域+块作用域+变量声明提升 一、let命令 【01】ES6新加...

  • ES6变量的两种命名方式

    ES6变量的两种命名方式# es6是ECMAScript 6.0(以下简称 ES6)是 JavaScript 语言...

网友评论

      本文标题:ES 6变量

      本文链接:https://www.haomeiwen.com/subject/scesxhtx.html