资讯专栏INFORMATION COLUMN

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

LeexMuller / 802人阅读

摘要:块级作用域中的块级作用域很有可能导致局部变量覆盖全局变量或者局部变量泄露成全局变量。也就是局部变量与全局变量不会打架块级作用域的出现,实际上使得获得广泛应用的立即执行匿名函数不再必要了。

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++。着重强调了 块级作用域

明天继续...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/78839.html

相关文章

  • JavaScript 时间与日期处理实战:你肯定被坑过

    摘要:本文时间与日期处理实战你肯定被坑过从属于笔者的前端入门与最佳实践中入门与最佳实践系列文章。然而由于地球的不规则自转,导致时间有误差,因此目前已不被当作标准时间使用。而在航空上,所有使用的时间划一规定是协调世界时。 本部分的知识图谱请参考编程语言知识图谱-时间与日期。showImg(https://segmentfault.com/img/remote/1460000007581725...

    ninefive 评论0 收藏0
  • D1.Nodejs 入门

    摘要:上下文切换上下文最直观的表现就是代码块中的,通常在面向对象的编程中用到,来指代当前类生成的对应实例,与其他语言的一致。咦,是干嘛的,有没有其他方式实现,请自行谷歌。 分享第一篇,关于 NodeJS —— Javascript 的常用知识以及如何从 Javascript 开发者过渡到 NodeJS 开发者(不会介绍具体的框架)。在读本文前,希望你对 javascript 有一些初步的认识...

    Rango 评论0 收藏0
  • 【重温基础】7.时间对象

    摘要:本文是重温基础系列文章的第七篇。系列目录复习资料资料整理个人整理重温基础语法和数据类型重温基础流程控制和错误处理重温基础循环和迭代重温基础函数重温基础表达式和运算符重温基础数字本章节复习的是中的时间对象,一些处理的方法。 本文是 重温基础 系列文章的第七篇。今日感受:做好自律。 系列目录: 【复习资料】ES6/ES7/ES8/ES9资料整理(个人整理) 【重温基础】1.语法和数据类型...

    YuboonaZhang 评论0 收藏0
  • ES6学习摘要(03)(新人学习)

    摘要:字符的表示法允许采用形式表示一个字符,其中表示字符的码点。方法,用来将字符的不同表示方法统一为同样的形式,这称为正规化。,默认参数,表示标准等价合成,返回多个简单字符的合成字符。返回布尔值,表示参数字符串是否在原字符串的头部。 ECMAScript6/ES6 入门 let和const命令变量的解构赋值 五、字符串的扩展 注:这章没什么可以理解的,看过一遍就行,所以大体上我把有用的一些东...

    番茄西红柿 评论0 收藏0
  • Luxon 初步介绍(Moment 团队日期另一个类库)

    摘要:我不是的深度用户只是日常会遇到一些时间格式化的需求之前用的都是不过对的感到有些不舒服同事介绍过里边用不可变数据的风格设计的所以就试试上星星很多请放心食用是项目的某个维护者开发的按照他个人想法进行了改进除了不可变性使用的工具做了更新也尝试到时 我不是 Moment 的深度用户, 只是日常会遇到一些时间格式化的需求,之前用的都是 Moment, 不过对 Moment 的 mutable A...

    stormzhang 评论0 收藏0

发表评论

0条评论

LeexMuller

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<