#我的21天#《ES6 标准入门》-D1

发布时间:2019-08-06 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了#我的21天#《ES6 标准入门》-D1脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

letconst命令

1.let 命令

  • 基本用法

语法类似 VAR,但是所声明的变量,只在 let 命令所在的代码块内有效。

for 循环中,就非常适合使用 let 声明变量。

var a = [];
for (let i = 0; i < 10; i++) {
  a[i] = function () {
    console.LOG(i);
  };
}
a[6](); // 6

一般使用 var 来声明变量 i 的话,输出的应该是10,但是因为是用 let 声明的。所以只有在本轮才有效。

  • 先声明,后使用 (暂时性死区)

let 不像 var那样会发生“变量提升”现象。所以,变量一定要在声明后使用,否则报错。

ES6明确规定,如果区块中存在 letconst 命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。

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

  • 目的

ES6规定暂时性死区和不存在变量提升,主要是为了减少运行时错误,止在变量声明前就使用这个变量,从而导致意料之外的行为。这样的错误在ES5是很常见的,现在有了这种规定,避免此类错误就很容易了。

2.块级作用域

ES5中的块级作用域很有可能导致局部变量覆盖全局变量或者局部变量泄露成全局变量。

所以使用 let 声明变量,可以有效的防止上面的两种情况的产生。从而产生了几个ES6特有的特点:

  • ES6允许块级作用域的任意嵌套。

  • 内层作用域可以定义外层作用域的同名变量。(也就是局部变量与全局变量不会打架)

  • (*)块级作用域的出现,实际上使得获得广泛应用的立即执行匿名函数(IIFE)不再必要了。

  • (*)函数本身的作用域,在其所在的块级作用域之内。

{
  let a = 'secret';
  function f() {
    return a;
  }
}
f() // 报错

上述代码中,因为f()是在块级作用域中,所以不能再外部调用。改进方法如下:

let f;
{
  let a = 'secret';
  f = function () {
    return a;
  }
}
f() // "secret"

总之要保证f()的作用域范围。

ES5的严格模式规定,函数只能在顶层作用域和函数内声明,其他情况(比如if代码块、循环代码块)的声明都会报错。(但是构成区块的大括号不能少)

3.const 命令

const 命令也用来声明变量,但是声明的是常量。一旦声明,常量的值就不能改变。(咦我在学C++吗...)

const 的使用条件与 let相似,也要满足上面的条件。

4.跨模块常量

// constants.js 模块
export const A = 1;
export const B = 3;
export const C = 4;

// test1.js 模块
import * as constants From './constants';
console.log(constants.A); // 1
console.log(constants.B); // 3

// test2.js 模块
import {A, B} from './constants';
console.log(A); // 1
console.log(B); // 3

(咦,我在学python吗...)

5.全局对象的属性

全局对象是最顶层的对象,在浏览器环境指的是window对象,在Node.js指的是global对象。ES5之中,全局对象的属性全局变量是等价的。

这样早成的麻烦就是很容易在不知不觉中就创建了全局变量。

所以。ES6规定:
①var命令和function命令声明的全局变量,依旧是全局对象的属性
②let命令、const命令、class命令声明的全局变量,不属于全局对象的属性。

看完第一章赶脚ES6把javascript变得更像一些其他的编程语言JAVAC++。着重强调了 块级作用域

明天继续...

脚本宝典总结

以上是脚本宝典为你收集整理的#我的21天#《ES6 标准入门》-D1全部内容,希望文章能够帮你解决#我的21天#《ES6 标准入门》-D1所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。