let和const


es6入门:let和const
顶层对象:在浏览器环境指的是window对象,ES5 之中,顶层对象的属性与全局变量是等价的。
ES6 一共有 6 种声明变量的方法:
var命令和function命令声明的全局变量,依旧是顶层对象的属性;另一方面规定, let命令、const命令、class命令声明的全局变量,不属于顶层对象的属性

let,const和var有区别

1.let命令、const命令、class命令声明的全局变量,不属于顶层对象的属性

2.作用域的范围不同

块级作用域

let const所声明的变量,只在该命令所在的代码块内有效。
let实际上为 JavaScript 新增了块级作用域
而创建这个块级作用域必须加有大括号,这个大括号内就是一个代码块

特例

其中for循环有一个特别之处,就是设置循环变量的那部分是一个父作用域,而循环体内部是一个单独的子作用域。

let可以解决这个循环外取值的问题:

var a = [];
for (let i = 0; i < 10; i++) {
  a[i] = function () {
    console.log(i);
  };
}
a[6](); // 6
块级作用域和let,const变量的关系

只要块级作用域内存在let命令,它所声明的变量就“绑定”(binding)这个区域,不再受外部的影响

绑定是指: 相同的变量a,如果在外部声明了a,而内部使用let内部又声明了a,那么这个变量a绑定这个内部的区域,不受外部影响

使用let命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”
所以,在没有let之前,typeof运算符是百分之百安全的,永远不会报错。现在这一点不成立了。
这样的设计是为了让大家养成良好的编程习惯,变量一定要在声明之后使用

块级作用域中声明函数

ES6 规定,块级作用域之中,函数声明语句的行为类似于let,在块级作用域之外不可引用。
考虑到环境导致的行为差异太大,建议不要使用,如果需要优先使用函数表达式

3. let const不存在变量提升

书中说在未声明前使用该变量将会直接报错,但其实在谷歌浏览器实验后发现let,const在未声明前使用该变量并没有报错,console.log打印后是undefined,可能是浏览器做了向下兼容的处理吧

4.不允许在相同作用域内,重复声明同一个变量

不能在函数内部重新声明参数

允许在块级作用域内声明函数。
函数声明类似于var,即会提升到全局作用域或函数作用域的头部。
同时,函数声明还会提升到所在的块级作用域的头部。

const

const初始化后必须赋值,否则报错,且这个值声明后就不能更改

const只能保证这个指针是固定的(即总是指向另一个固定的地址),至于它指向的数据结构是不是可变的,就完全不能控制了。因此,将一个对象声明为常量必须非常小心
如果真的想将对象冻结,应该使用Object.freeze方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值