欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

es6 let和const

程序员文章站 2023-12-22 13:45:46
...

首先

if(a){
	var num = 100
}
console.log(num)

其实很容易 ,具体的过程相信也不用多唠叨 ,由于变量提升,定义num的步骤被提到了前面,所以在本例中,如果a为假,那么结果是undefined
还有 在一个循环中,

for(var i = 0; i < 10; i++){}
console.log(i)			//i=10

再循环之后 我们依然可以访问到本应该只在循环体内出现的i.这些数据的生存周期和范围让人感觉很不严谨,在实际开发过程中就可能会造成意料之外的结果,为了变量的生存空间的到更好的控制,es6引入了块级作用域这一说法,主要存在于 函数体内 以及{}之间的代码块中

要强调的一点是 在块级作用域中,要尽量避免去使用函数声明,原因是 在使用函数声明的过程中相当于使用var,即会提升到当前作用域的顶部,这不是我们想要的,解决办法是尽量使用函数表达式代替函数声明

let

  • 1 不会造成刚才说的变量提升
if(a){
	var num = 100
}
console.log(num)

报错

  • 2 重复声明(一个作用域中)
var i = 1;
let i = 2

报错

  • 3 不会委托到顶层对象 ,即var a = 1,则 window.a = 1,但是let a = 1,在window对象就找不到a这个属性了 。说道顶层对象也做一个总结

浏览器里面,顶层对象是window,但 Node 和 Web Worker 没有window。
浏览器和 Web Worker 里面,self也指向顶层对象,但是 Node 没有self。
Node 里面,顶层对象是global,但其他环境都不支持。

const

const让js定义数据的时候也有了语义的成分,即定义常量。const变量指向的内存地址所保存的数据是不能修改的,对于简单数据类型来说,数据的值就保存在变量所指向的内存地址,所以的确是不能改变的,但是对于复合数据类型来说,变量指向的内存空间保存的是指向实际数据的指针。也就是说const只能保证这个指针指向的地址不会变,但是她指向的数据是否可以改变则不受控制。

临时性死区

JavaScript引擎在扫描代码时,遇见的变量(var定义)就会提升至当前作用域顶端,let ,const定义就会将变量放进TDZ(暂时性死区)中,在访问到暂时性死区中的变量时会触发运行时错误导致报错,只有在执行变量声明语句后才会将变量从死区中释放出来

var data = 'a';
(function(){
	console.log(data);
	let data = 'b';
}())

例子更直观些,由于在作用域中let声明被放入暂时性死区 ,所以打印会报错

在循环中的不同

for (var i = 0; i < 3; i++) {
  var i = 'aaa';
  console.log(i);
}					//aaa

在当时刚接触js的时候肯定有遇到过这类例题。之前定的理解是在循环之后才进行的i赋值,但是的确还是有点难以接受

for (let i = 0; i < 3; i++) {
  let i = 'aaa';
  console.log(i);
}					//aaaaaaaaa

原因是在处理的时候(let),圆括号内有一个隐藏的作用域,然后在每次遍历的时候都相当于创建了一个同名变量将之前的变量迭代。看得出es6很大程度上提升了代码的严谨性
以后会更新例子

上一篇:

下一篇: