• <bdo id='jiR2s'></bdo><ul id='jiR2s'></ul>
  • <legend id='jiR2s'><style id='jiR2s'><dir id='jiR2s'><q id='jiR2s'></q></dir></style></legend>
    <i id='jiR2s'><tr id='jiR2s'><dt id='jiR2s'><q id='jiR2s'><span id='jiR2s'><b id='jiR2s'><form id='jiR2s'><ins id='jiR2s'></ins><ul id='jiR2s'></ul><sub id='jiR2s'></sub></form><legend id='jiR2s'></legend><bdo id='jiR2s'><pre id='jiR2s'><center id='jiR2s'></center></pre></bdo></b><th id='jiR2s'></th></span></q></dt></tr></i><div id='jiR2s'><tfoot id='jiR2s'></tfoot><dl id='jiR2s'><fieldset id='jiR2s'></fieldset></dl></div>
  • <tfoot id='jiR2s'></tfoot>

      <small id='jiR2s'></small><noframes id='jiR2s'>

      1. 浅谈ECMAScript6新特性之let、const

        在ES6之前,JavaScript只有全局作用域和函数作用域,没有块级作用域,因此在一些复杂的嵌套逻辑中,变量声明和使用的容易混淆,let的出现就解决了这个问题。
          <bdo id='Zmn1Q'></bdo><ul id='Zmn1Q'></ul>
          <legend id='Zmn1Q'><style id='Zmn1Q'><dir id='Zmn1Q'><q id='Zmn1Q'></q></dir></style></legend>
          <i id='Zmn1Q'><tr id='Zmn1Q'><dt id='Zmn1Q'><q id='Zmn1Q'><span id='Zmn1Q'><b id='Zmn1Q'><form id='Zmn1Q'><ins id='Zmn1Q'></ins><ul id='Zmn1Q'></ul><sub id='Zmn1Q'></sub></form><legend id='Zmn1Q'></legend><bdo id='Zmn1Q'><pre id='Zmn1Q'><center id='Zmn1Q'></center></pre></bdo></b><th id='Zmn1Q'></th></span></q></dt></tr></i><div id='Zmn1Q'><tfoot id='Zmn1Q'></tfoot><dl id='Zmn1Q'><fieldset id='Zmn1Q'></fieldset></dl></div>
            • <tfoot id='Zmn1Q'></tfoot>
            • <small id='Zmn1Q'></small><noframes id='Zmn1Q'>

                <tbody id='Zmn1Q'></tbody>

                  浅谈ECMAScript6新特性之let、const

                  let

                  在ES6之前,JavaScript只有全局作用域和函数作用域,没有块级作用域,因此在一些复杂的嵌套逻辑中,变量声明和使用的容易混淆,let的出现就解决了这个问题。

                  1. 块级作用域

                  let关键字可以声明块状作用域的变量,这个变量只在当前块级作用域有效。比如:

                  function foo() {
                      var bar = "bar A";
                      if (true) {
                          var bar = "bar B";
                          console.log(bar); // 输出“bar B”
                      }
                      console.log(bar); // 输出“bar B”
                  }
                  

                  输出“bar B”两次是因为bar被覆盖了,虽然if语句中的bar变量也是在函数内部声明的,但是仍然被覆盖了。如果使用let来代替var,则代码如下:

                  function foo() {
                      let bar = "bar A";
                      if (true) {
                          let bar = "bar B";
                          console.log(bar); // 输出“bar B”
                      }
                      console.log(bar); // 输出“bar A”
                  }
                  

                  此时输出了两个不同的值,let声明的变量只在两个块级作用域中有效,代码更加的清晰易懂。

                  1. 暂时性死区

                  let声明的变量会受到“暂时性死区”的限制,只有在变量声明后才能使用。比如:

                  function foo() {
                      console.log(bar); // 输出“undefined”,而不是报错
                      var bar = "bar";
                      console.log(bar); // 输出“bar”
                  }
                  
                  function baz() {
                      console.log(bar); // 报错
                      let bar = "bar";
                      console.log(bar);
                  }
                  

                  在上述代码中,使用var的时候,在变量声明之前就能使用,但是使用let的时候,变量声明的前面使用会报错。

                  1. 循环中的let

                  在循环中使用let关键字可以避免由于变量声明提升而导致的对同一个变量的重复声明问题,比如:

                  for (var i = 0; i < 10; i++) {
                      setTimeout(function() {
                          console.log(i); // 输出“10”,而不是“0-9”
                      }, 1000);
                  }
                  
                  for (let i = 0; i < 10; i++) {
                      setTimeout(function() {
                          console.log(i); // 输出“0-9”,符合预期
                      }, 1000);
                  }
                  

                  第一个循环输出的是10,原因是因为setTimeout是异步的,闭包中的i变量是共享的,导致输出的都是最后修改的值。而第二个循环使用let,则会每次迭代声明一个新的变量,避免了此问题。

                  const

                  const关键字用来声明常量,用法和let类似,只不过声明的变量的值是不可修改的。

                  const PI = 3.14;
                  PI = 3; // 报错:“Assignment to constant variable”
                  
                  const ARR = [1,2,3];
                  ARR.push(4); // 可以操作数组,但不能覆盖ARR整个变量
                  
                  console.log(ARR); // 输出[1,2,3,4]
                  

                  值得注意的是,使用const声明的变量不可变性,只是指向的地址不能变,如果指向一个对象的地址,仍然可以改变对象属性的值,如:

                  const PERSON = {name: "Tom", age: 18};
                  PERSON.age = 19; // 可以改变对象属性的值,不会报错
                  console.log(PERSON); // 输出{name: "Tom", age: 19}
                  

                  结束语

                  let、const是ES6提出的在作用域和变量控制上的重要语法,用法和var有所不同,能够解决var本身存在的一些问题。在实际开发中,应当充分发挥它们的作用和优势,使代码更加清晰易懂,从而提高开发效率。

                  本站部分内容来源互联网,如果有图片或者内容侵犯了您的权益,请联系我们,我们会在确认后第一时间进行删除!

                  相关文档推荐

                  treetable.js没有checked做联动。于是自己基于treetable开发的一个小功能,希望能和大家一起交流一下。 1. 在当前HTML文档checked监听函数中增加以下代码 //联动 table.on('checkbox(quan_list)', function(obj){ //console.log(obj); //当前id var id = obj.
                  当使用Javascript的attachEvent来绑定事件时,我们希望能够给事件处理函数传递一些参数,但是attachEvent本身并不支持传递参数。下面介绍两种解决方法。
                  KnockoutJS是一款流行的JavaScript库,针对一个web应用程序的建立提供了比较好的基础架构。其中,表单的数据绑定功能是KnockoutJS最为常用的功能之一。本文将详细讲解KnockoutJS 3.x
                  下面是用javascript实现改善用户体验之alert提示效果的完整攻略。
                  在学习JavaScript编写贪吃蛇游戏之前,需要掌握以下的前置知识:

                      <legend id='XEIHw'><style id='XEIHw'><dir id='XEIHw'><q id='XEIHw'></q></dir></style></legend>
                        <bdo id='XEIHw'></bdo><ul id='XEIHw'></ul>

                            <tbody id='XEIHw'></tbody>

                            <tfoot id='XEIHw'></tfoot>
                          1. <i id='XEIHw'><tr id='XEIHw'><dt id='XEIHw'><q id='XEIHw'><span id='XEIHw'><b id='XEIHw'><form id='XEIHw'><ins id='XEIHw'></ins><ul id='XEIHw'></ul><sub id='XEIHw'></sub></form><legend id='XEIHw'></legend><bdo id='XEIHw'><pre id='XEIHw'><center id='XEIHw'></center></pre></bdo></b><th id='XEIHw'></th></span></q></dt></tr></i><div id='XEIHw'><tfoot id='XEIHw'></tfoot><dl id='XEIHw'><fieldset id='XEIHw'></fieldset></dl></div>
                          2. <small id='XEIHw'></small><noframes id='XEIHw'>