摘要:前言来自阅读阮老师的入门的小结疑问先开个坑,慢慢填问题和循环先看书中的一段代码这个我们知道,是因为每个都被赋予了一个函数,输出作用域的,而是在全局作用域下调用的,所以输出的是全局变量,因为循环没有块作用域,所以输出。
前言
来自阅读阮老师的《ES6入门》的小结+疑问~先开个坑,慢慢填
问题Q:let和for循环?
先看书中的一段代码:
var a = []; for (var i = 0; i < 10; i++) { a[i] = function () { console.log(i); }; } a[6](); // 10
这个我们知道,是因为每个a[i]都被赋予了一个函数,输出作用域的i,而a[6]()是在全局作用域下调用的,所以输出的i是全局变量i,因为for循环没有块作用域,所以输出10。
改成let后:
var a = []; for (let i = 0; i < 10; i++) { a[i] = function () { console.log(i); }; } a[6](); // 6
其实我第一次看到这里是不能理解的,然后看到书上说:
变量i是let声明的,当前的i只在本轮循环有效,所以每一次循环的i其实都是一个新的变量,所以最后输出的是6。
好吧,还是感觉没清楚到底这个机制是啥样的(⊙﹏⊙),那我就用小工具把它转为ES5语法了(虽然也不能当成完全等同吧(lll¬ω¬)):
"use strict"; var a = []; var _loop = function _loop(i) { a[i] = function () { console.log(i); }; }; for (var i = 0; i < 10; i++) { _loop(i); } a[6](); // 6
这个结果就很清楚啦,它类似在执行语句的外面包裹了一个函数,结果就是i当成参数传进去了,而且还形成了一个闭包:
再来看另一个例子:
for (let i = 0; i < 3; i++) { let i = "abc"; console.log(i); } // abc // abc // abc
原文说:
for循环还有一个特别之处,就是设置循环变量的那部分是一个父作用域,而循环体内部是一个多带带的子作用域。
转换之后的结果(这里有小问题0_0,单纯转换出来会都是i,但是多复制一份,转出来就是下面这种,我个人觉得根据意思应该转成这样才是对的):
for (var _i = 0; _i < 3; _i++) { var _i2 = "abc"; console.log(_i2); }
Q:let特性?
不存在变量提升
暂时性死区(temporal dead zone)
在代码块内,使用let命令声明变量之前,该变量都是不可用的
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/93500.html
摘要:模板字面量相当于格式化字符串字符串用两个包含起来并且内部的占位符用标识一般用于标识多行文本或者配合函数使用与箭头函数用于数组是用于让数组每一个元素都调用函数的语法基本格式为其中为数组元素下标为当前元素所属的数组对象在实际调用时只需要箭头函数 1.模板字面量相当于格式化字符串,字符串用两个``包含起来,并且内部的占位符用${variable}标识.一般用于标识多行文本或者配合函数使用. ...
摘要:前端小白最近面试几家公司,写点面经分享给大家,同时记录下自己的缺点以供后期补足,各个公司的开发方向不同,请各位理性看待。直接现场手敲触发的样式。数组去重如何实现如果用的话,里面如何写排序算法。对象何时被修改心态需要调整好,不紧张不匆忙。 前端小白最近面试几家公司,写点面经分享给大家,同时记录下自己的缺点以供后期补足,各个公司的开发方向不同,请各位理性看待。 问题相关 Css 布局方式有...
阅读 1664·2021-11-22 12:09
阅读 1396·2019-08-30 13:22
阅读 2051·2019-08-29 17:00
阅读 2615·2019-08-29 16:28
阅读 2919·2019-08-26 13:51
阅读 1158·2019-08-26 13:25
阅读 3219·2019-08-26 12:14
阅读 2988·2019-08-26 12:14