最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 【ES6】你真的了解let/const吗

    正文概述 掘金(izhouwl)   2021-04-04   314

    在循环初始化语句中声明变量

    今天看书看到下面几句话:

    《深入理解ES6》 第一章,块级作用域绑定,第9页循环中的let声明一节中提到

    《JavaScript高级程序设计(第4版)》 第三章,语言基础,3.3.2节,第28页中也提到

    最佳实践

    1. for循环中推荐使用let来声明迭代变量
    2. for...infor...of推荐使用const来声明迭代变量。

    光看有点不好理解为什么这么设计,写点代码来实践一下。

    代码实践

    1. 异步打印

    for (var i = 0; i < 3; ++i) {
      setTimeout(() => {console.log(i)})
    }
    

    输出 3 3 3

    原因:由于var声明会进行变量提升。函数指向全局作用域的i,打印i的时候,i的值已经变成3了。

    改成let试试

    for (let i = 0; i < 3; ++i) {
      setTimeout(() => {console.log(i)})
    }
    

    输出 0 1 2

    原因:每次循环迭代都会在其块级作用域中创建一个新变量i

    异曲同工的ES5写法

    for (var i = 0; i < 3; ++i) {
      (function (i){
        setTimeout(() => {console.log(i)})
      }(i))
    }
    

    输出 0 1 2

    原因:利用闭包,人为做了一次i的拷贝。

    2. 在循环中创建函数

    var fns = []
    for (var i = 0; i < 3; ++i) {
      fns.push(() => { console.log(i) })
    }
    fns.forEach(fn => fn())
    

    输出 3 3 3

    原因:由于var声明会进行变量提升。函数使用全局作用域的同一个i,打印i的时候,i的值已经变成3了。

    改成let试试

    var fns = []
    for (let i = 0; i < 3; ++i) {
      fns.push(() => { console.log(i) })
    }
    fns.forEach(fn => fn())
    

    输出 0 1 2

    原因:let每轮循环都创建了一个新的变量i,三个函数指向了三个不同的i

    异曲同工的ES5写法

    var fns = []
    for (var i = 0; i < 3; ++i) {
      (function (i) {
        fns.push(() => { console.log(i) })
      }(i))
    }
    fns.forEach(fn => fn())
    

    输出 0 1 2

    原因:利用函数作用域的特点,每次循环都人为拷贝了变量i

    使用引用类型变量进行循环

    for (const i = {a: 0}; i.a < 3; i.a = i.a + 1) {
      i[`${i.a}`] = i.a
      setTimeout(() => console.log(i), 1000 * i.a)
    }
    // { '0': 0, '1': 1, '2': 2, a: 3 }
    // { '0': 0, '1': 1, '2': 2, a: 3 }
    // { '0': 0, '1': 1, '2': 2, a: 3 }
    

    原因:每轮循环中,JavaScript引擎拷贝的i实际上是一个指向堆内存对象的地址。

    因为这里只是改变了堆内存对象属性的值,并没有改变i的值(实际上i是一个指向堆内存对象的指针),可以使用const来声明i,这与使用letvar结果相同。

    如果JavaScript提供了查看变量栈内存地址的API,那么验证这种说法就轻而易举了。


    起源地下载网 » 【ES6】你真的了解let/const吗

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元