You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
console.log(a)// Uncaught ReferenceError: Cannot access 'a' before initializationconsole.log(typeofa)// 'undefined'console.log(typeofDate)// 'function'console.log(window.Date)// function Date() {}
之前执行的 console.log(a) 直接报错, 阻止程序运行.
直接运行console.log(typeof a) 也一样, 而不做任何声明的时候, 会输出 'undefined'.
leta=10letDate=1000console.log(window.Date)// function Date() {}console.log(a)// 10console.log(Date)// 1000console.log(window.a)// undefined
正常逻辑执行后, 并没有想象中, window.a和a相等. 产生上面现象的原因是什么呢??
暂时性死区(temporal dead zone, TDZ)
在let/const声明前访问其变量会造成初始化之前不能访问,这种现象叫做 TDZ.
let/const不会对 scope 域名做覆盖/污染
上述例子中, a 和Date声明后并没有污染 window.a和window.Date, 因此当使用的时候需要覆盖的时候使用 let/const 声明的变量, 需要手动覆盖.
循环中形成新的块级绑定
早年有一个经典的面试题, 叫做 创建10 个 div.点击输出对应的索引.
笔者在初次写 js 的时候, 写成了这种错误形式
// bad wayfor(vari=0;i<10;i++){vardiv=document.createElement('div')div.className='item'div.innerHTML=idiv.onclick=function(){alert(i)}document.body.appendChild(div)}
输出的结果也往往是 10, 需求是点击索引啊. 造成这种结果的原因是
var变量提升, 当点击的时候此时 i 是 10
因此我们常常用 IIFE(即时执行函数)
// good wayfor(vari=0;i<10;i++){vardiv=document.createElement('div')div.className='item'div.innerHTML=idiv.onclick=(function(i){returnfunction(){alert(i)}})(i)document.body.appendChild(div)}
<深入理解ES6>一书中,提起 let/const 这也是平常工作用的比较多,最近需要给公司做培训. 重新复习下以往的知识点.
本文首发自 github 个人博客. 转载请注明出处. 来这里讨论
let/const
再聊
let/const
之前, 让我们回顾下我们的老朋友var
, 他有什么特点或特性var
通过下面的例子, 可以复习下, 关键字
var
声明带来的影响.由于
变量提升
的缘故, function 优先于 var提升且定义,此时 a只声明,未赋值,函数已声明且赋值.同样的代码,把
window
改成global
放在node里面运行发现结果又不一样,global.Date
没有被重新赋值, 是因为在node运行环境里面, node 出于代码安全考虑, 每一个文件最终变成了由require('module').wrapper
方法包裹起来, 每一个node的 js 文件, 需要 通过exports或module.exports暴露出模块的方法和属性才能使用.由此可见
var声明
会带来以下影响通常的习惯可能是, 放在 top scope 的位置, 作为一个规范来约束自己或团队.
但并不是每个人都能很好的按照规范来做, 于是ES6 推出了 let/const来解决
var声明
的弊端let/const
把上面的代码换成
let
之前执行的
console.log(a)
直接报错, 阻止程序运行.直接运行
console.log(typeof a)
也一样, 而不做任何声明的时候, 会输出'undefined'
.正常逻辑执行后, 并没有想象中,
window.a
和a
相等. 产生上面现象的原因是什么呢??暂时性死区(temporal dead zone, TDZ)
在
let/const
声明前访问其变量会造成初始化之前不能访问
,这种现象叫做 TDZ.let/const不会对 scope 域名做覆盖/污染
上述例子中,
a
和Date
声明后并没有污染window.a
和window.Date
, 因此当使用的时候需要覆盖的时候使用let/const
声明的变量, 需要手动覆盖.循环中形成新的块级绑定
早年有一个经典的面试题, 叫做 创建10 个 div.点击输出对应的索引.
笔者在初次写 js 的时候, 写成了这种错误形式
输出的结果也往往是 10, 需求是点击索引啊. 造成这种结果的原因是
var变量提升, 当点击的时候此时 i 是 10
因此我们常常用 IIFE(即时执行函数)
那有木有更好的方案, 能不能每次 循环的时候创建一个新的 i,
let
具备这一特性其他
const
用来保存常量, let 在修改的使用. const 对对象处理的时候, 对象/数组属性赋值还可以修改.关于对象的常量问题, 放到后面章节整理.
The text was updated successfully, but these errors were encountered: