范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

因为说let没有变量提升,我被嘲笑了

  最近在和同事闲聊var和let的区别时,我被嘲笑了,起因是我提出了var具有变量提升的特性而let没有的观点。在我看来这不是最常刷到的面试题吗?但是在一番仔细研究之后我发现事情并不是我想象的这样,即let同样存在变量提升,只是let存在暂时性死区。变量提升证明var声明存在变量提升
  通常我们是这样子来证明var存在变量提升的。function fn(){     console.log(a) // undefined     var a = 12 } fn() 复制代码
  为什么这段代码会输出undefined,而不是报错呢?
  原因就是js在创建执行上下文时,会检查代码,找出变量声明和函数声明,并将函数声明完全存储在环境中,而将通过var声明的变量设定为undefined,这就是所谓的变量提升。从字面上理解就是变量和函数声明会被移动到函数或者全局代码的开头位置。
  那么当我们将var替换为let时,结果又会如何?function fn(){     console.log(a) // Uncaught ReferenceError: a is not defined     let a = 12 } fn() 复制代码
  意料之中,代码报错了。很多人通过这个反例,便认为let没有变量提升,但其实这是错误的。上面举的例子只能证明,var存在变量提升,但是并不能证明let不存在变量提升。证明let声明存在变量提升
  我们再举一个例子:var x = "parent value"; (function() {   console.log(x); // parent value }()) 复制代码
  代码会输出parent value,原因很简单,涉及到了作用域链的知识。在匿名函数作用域中没有找到x变量,便会沿着作用域链,找到父级作用域,然后便再父级作用域中找到了x变量,并输出。
  接着我们在匿名函数中,加入let进行变量声明,此时结果会是如何呢?var x = "parent value"; (function() {   console.log(x); // Uncaught ReferenceError: x is not defined   let x = "child value" }()) 复制代码
  想不到吧!此时的代码又会报错了,从这里其实可以看出let也是存在变量提升的,知识在变量显式赋值之前不能对变量进行读写,否则就会报错,这也就是所谓的let和const的暂时性死区。
  暂时性死区(Temporal Dead Zone )
  引用MDN上的定义
  let bindings are created at the top of the (block) scope containing the declaration, commonly referred to as "hoisting". Unlike variables declared with var, which will start with the value undefined, let variables are not initialized until their definition is evaluated. Accessing the variable before the initialization results in a ReferenceError. The variable is in a "temporal dead zone" from the start of the block until the initialization is processed.
  大概意思便是let同样存在变量提示(hoisting),只是形式与var不同,var定义的变量将会被赋予undefined的初始值,而let在被显式赋值之前不会被赋予初始值,并且在赋值之前读写变量都会导致 ReferenceError 的报错。从代码块(block)起始到变量求值(包括赋值)以前的这块区域,称为该变量的暂时性死区。var x = "parent value"; (function() {   // let x 此时暂时性死区开始   console.log(x); // Uncaught ReferenceError: x is not defined   //暂时性死区结束   let x = "child value"  }()) 复制代码总结
  事实证明let和var同样存在变量提升,而且let声明还具有暂时性死区的概念。
  作者:37.2 同志
  链接:https://juejin.cn/post/6983702070293430303
  来源:稀土掘金
  著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

DeepMind联合创始人Suleyman从谷歌离职品玩1月21日讯,据新浪科技报道,谷歌旗下DeepMind的联合创始人MustafaSuleyman已从谷歌离职,加盟风投公司GreylockPartners成为合伙人。DeepM微信大更新,终于可以搜索添加好友了,还有一个好用的摸鱼功能赶在过年之前,微信突然更新了foriOS8。0。17版本,凭借语音暂停和批量删除好友两个新功能成功上了两次热搜第一。在广大用户还在努力挖掘新版本微信还有哪些新功能的同时,微信又于近加密货币交易平台遭黑客攻击400个账户被盗据台湾自由时报网站1月20日报道,新加坡的加密货币交易平台Crypto。com传出在17日遭到黑客攻击,Crypto。com执行长马尔沙韦克证实有约400个账户被入侵。专家估算黑客主流彩电品牌一路大跌,华为智慧屏却逆势高歌,凭什么?新电视,我还在犹豫用华为还是创维,家里买了一些新牌子的家电老出问题,现在的创维电视用了十年一直很稳定,也没广告一说。降维打击可能类似于当年诺基亚和苹果吧。当年诺基亚也是手机的霸主,华为王军未来智能驾驶智能座舱等应用一定是常用常新的新京报贝壳财经讯(记者许诺)1月20日,华为智能汽车解决方案BUCOO王军在智驾碳新第十七届超级汽车论坛上表示,汽车产品的迭代周期越来越快,如果是智能驾驶智能座舱等方面的应用,一定荣耀MagicV测评聊一聊使用半个月后的真实体验荣耀MagicV作为荣耀第一款折叠屏手机,从产品层面上看已经足够成熟,为了能对荣耀MagicV这台手机有一个更深层次的认识,我们将其重度使用半个月后,再来聊一聊这款手机到底如何。这花钱不多惊喜不小!支持支付宝的诺基亚手机,最适合春节送老人俗话说新年新气象,家中的老长辈也应该趁春节来临之际升级一下数码设备了。手机是日常生活中必不可少的,可对老人来说智能手机要么不会用,要么用不习惯,所以一款合适的功能机就显得更有必要了CISLinuxCentos7最新基线标准进行系统层面基线检测CISLinuxCentos7最新基线标准进行系统层面基线检测按照CISLinuxCentos7最新基线标准进行系统层面基线检测检查项系统crontab权限设置加固建议依次执行rmOPPOFindX5真机首曝再次挑战审美底线,网友直呼看不懂年前的骁龙8旗舰手机已经发布了多款,性能部分几乎是清一色的配置,最终性能表现也微乎其微。智能手机发展了十几年的时间,配置同质化非常严重。核心的性能屏幕和相机也都相差无几,所以很多厂实用工具篇这五款Windows软件,强大到每一个都堪称神器俗话说工欲善其事,必先利其器,又俗话说好软件使用一时爽,一直使用一直爽。在之前的内容中,已经给大家推荐过everything微PE知犀思维导图Geek等软件,今天给大家继续分享五款iphone8plus还值不值得购买了?被称为一带神机iphone8plus还值不值得购买了?图片来自网络首先我们来看看苹果8p的配置操作系统iOS硬件参数CPU苹果A11M11运动协处理器运行内存3GB机身容量64GB