美文网首页
let和const学习

let和const学习

作者: bubblyface | 来源:发表于2017-02-15 14:52 被阅读0次

let和Const命令

let命令

let命令所声明的变量只能在代码块中存在。

暂时性死区

使用let声明变量时,只要变量在还没有声明完成前使用,就会报错。
暂时性死区的本质就是,只要一进入当前作用域,所要使用的变量就已经存在了,但是不可获取,只有等到声明变量的那一行代码出现,才可以获取和使用该变量。

不允许重复声明

let不允许在相同作用域重复声明同一个变量

块级作用域

es6新增了块级作用域,let所带来的结果

ES6的块级作用域与函数声明

es5 函数不可以在块级作用域声明函数
ES6 规定,块级作用域之中,函数声明语句的行为类似于let,在块级作用域之外不可引用
ES6 改变了块级作用域内声明的函数的处理规则,显然会对老代码产生很大影响。为了减轻因此产生的不兼容问题,ES6在附录B里面规定,浏览器的实现可以不遵守上面的规定,有自己的行为方式。
! 块级作用域内部是可以访问全局变量的

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

根据这三条规则,在浏览器的 ES6 环境中,块级作用域内声明的函数,行为类似于var声明的变量
考虑到环境导致的行为差异太大,应该避免在块级作用域内声明函数。如果确实需要,也应该写成函数表达式,而不是函数声明语句。

`
// 函数声明语句
{
let a = 'secret';
function f() {
return a;
}
}

// 函数表达式
{
let a = 'secret';
let f = function () {
return a;
};
}
`

do 表达式

让块级作用域变成表达式,可以返回值
let x = do{ let t = f(); t * t+1; }

const命令

只读常量,一旦声明,常量的值就不可以改变,所以声明的时候必须给其赋值

  1. const的作用域与let命令相同:只在声明所在的块级作用域内有效。
  2. const命令声明的常量也是不提升,同样存在暂时性死区,只能在声明的位置后面使用。
  3. const声明的常量,也与let一样不可重复声明。
  4. 对于复合类型的变量,变量名不指向数据,而是指向数据所在的地址。const命令只是保证变量名指向的地址不变,并不保证该地址的数据不变,所以将一个对象声明为常量必须非常小心
    const a = []; a.push('Hello'); // 可执行 a.length = 0; // 可执行 a = ['Dave']; // 报错
  5. 上面代码中,常量foo储存的是一个地址,这个地址指向一个对象。不可变的只是这个地址,即不能把foo指向另一个地址,但对象本身是可变的,所以依然可以为其添加新属性。
  6. 对象冻结

顶层属性对象

ES6为了改变这一点,一方面规定,为了保持兼容性,var命令和function命令声明的全局变量,依旧是顶层对象的属性;另一方面规定,let命令、const命令、class命令声明的全局变量,不属于顶层对象的属性。也就是说,从ES6开始,全局变量将逐步与顶层对象的属性脱钩。
`
var a = 1;
// 如果在Node的REPL环境,可以写成global.a
// 或者采用通用方法,写成this.a
window.a // 1

let b = 1;
window.b // undefined
`
上面代码中,全局变量a由var命令声明,所以它是顶层对象的属性;全局变量b由let命令声明,所以它不是顶层对象的属性,返回undefined。

global对象

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

相关文章

  • let和const学习

    let和Const命令 let命令 暂时性死区 使用let声明变量时,只要变量在还没有声明完成前使用,就会报错。暂...

  • let和const

    新的赋值语句let和const let和const命令

  • 工作中常用的 ES6 语法

    变量声明 let 和const 不用var, 用const声明只读变量,let声明变量。let和const都是块级...

  • 关于ES6以及ES6常用的方法

    1、变量声明let和const let表示变量、const表示常量。let和const都是块级作用域。 2、模板字...

  • ES6需要记忆理解的地方

    let和const命令 1、let和const均无变量提升。2、let变量指向的地址可变,const指向的地址不可...

  • (JS)

    ES6 let、const和var的区别 let和const声明变量不存在变量提升 let和const不能重复声明...

  • ES6这些就够了

    1.变量声明const和let let表示变量、const表示常量。let和const都是块级作用域 2.模板字符...

  • 【JS】从ECMA学习let、const、var变量声明与声明提

    let、const、var是JS中的声明关键字 let和const 我们熟知的let和const的特性,常见的就有...

  • 《ECMAScript 6 入门》 读书笔记

    一、let和const 这块相对来说还是比较基础的,有了解学习let和const定义变量的一些特点:不能重复定义、...

  • ES6编码风格

    http://es6.ruanyifeng.com/#docs/style let和const let和const...

网友评论

      本文标题:let和const学习

      本文链接:https://www.haomeiwen.com/subject/bvsqwttx.html