我是靠谱客的博主 甜美小霸王,最近开发中收集的这篇文章主要介绍[学习笔记]01.let 和 const 命令,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

学习阮一峰《ES6标准入门》(第二版),所做的笔记。

 

一.let命令

    let命令是ES6新增的命令,用来声明变量。它的用法类似于var 。它有以下特点:

 

1.它所声明的变量必须在let所在的代码块中。

      {

       var a=1;

       let b=2; 

      }  

  console.log(a);  // 打印出来a是1。

  console.log(b);  //打印出来b is not defined

       上面的代码块中定义了两个变量,a是用var来定义的,b是用let来定义的,在代码块外调用里面的变量,let定义的变量在代码段内有效。

 

2.不存在变量提升现象

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

     {

           console.log(a);  //输出 undefined

           console.log(b);  //报错,输出b is not defined

           var a=1;

           let b=2;        

         }

上面的代码里变量a是用var来声明的,所以可以用到变量提升,脚本运行的时候变量已经存在,但是还没有值,所以会输出undefined。b用let声明的,这表明在声明它之前,变量b是不存在的,这时候如果用到它,就是报错。

 

3.暂时性死区

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

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

总之,在代码块内,使用 let 命令声明变量之前,该变量都是不可用的。这在语法上,称为 “ 暂时性死区 ” ( temporal dead zone ,简称 TDZ )。

 

  if (true) {

  // TDZ 开始

  tmp = 'abc'; // ReferenceError

  console.log(tmp); // ReferenceError

  let tmp; // TDZ 结束

  console.log(tmp); // undefined

  tmp = 123;

  console.log(tmp); // 123

  }

 

4.不允许重复声明

   Let 不允许在同一个作用域下重复声明一个变量。

   // 报错

   function () {

  let a = 10;

  var a = 1;

    }

 // 变量a重复声明报错

 

二.const命令

const声明一个只读的常量。一旦声明,常量的值就不能改变。

  const PI = 3.1415;

  PI // 3.1415

  PI = 3;

  // TypeError: Assignment to constant variable.

上面代码表明改变常量的值会报错。

 

const声明的变量不得改变值,这意味着, const 一旦声明变量,就必须立即初始化,不能留到以后赋值。

const foo;

// SyntaxError: Missing initializer in const declaration

上面代码表示,对于const来说,只声明不赋值,就会报错。

 1.const的作用域与let命令相同:只在声明所在的块级作用域内有效。

  if (true) {

    const MAX = 5;

  }

  MAX // Uncaught ReferenceError: MAX is not defined

 

   2.const命令声明的常量也是不提升,同样存在暂时性死区,只能在声明的位置后面使用。

    if (true) {

      console.log(MAX); // ReferenceError

      const MAX = 5;

    }

上面代码在常量MAX声明之前就调用,结果报错。

const声明的常量,也与let一样不可重复声明。

var message = "Hello!";

let age = 25;

// 以下两行都会报错

const message = "Goodbye!";

const age = 30;

 ES5 只有两种声明变量的方法:var命令和function命令。 ES6 除了添加let和const命令,后面章节还会提到,另外两种声明变量的方法:import命令和class命令。所以, ES6 一共有 6 种声明变量的方法。

 

三.ES6 的块级作用域

 let实际上为 JavaScript 新增了块级作用域。

function f1() {

   let n = 5;

   if (true) {

   let n = 10;

}

   console.log(n); // 5

}

上面的函数有两个代码块,都声明了变量n,运行后输出 5 。这表示外层代码块不受内层代码块的影响。如果使用var定义变量n,最后输出的值就是10 。

 

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

{{{{{let insane = 'Hello World'}}}}};

上面代码使用了一个五层的块级作用域。外层作用域无法读取内层作用域的变量。

 

{{{{

{let insane = 'Hello World'}

console.log(insane); // 报错

}}}};

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

// IIFE 写法

(function () {

var tmp = ...;

...

}());

// 块级作用域写法

{

let tmp = ...;

...

}

 

四:全局对象的属性

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

比如:

  window.a = 1;

  a // 1

  a = 2;

  window.a // 2

上面代码中,全局对象的属性赋值与全局变量的赋值,是同一件事。(对于 Node 来说,这一条只对 REPL 环境适用,模块环境之中,全局变量必须显式

声明成global对象的属性。)

 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。

转载于:https://www.cnblogs.com/hongjingwu/p/8029489.html

最后

以上就是甜美小霸王为你收集整理的[学习笔记]01.let 和 const 命令的全部内容,希望文章能够帮你解决[学习笔记]01.let 和 const 命令所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(91)

评论列表共有 0 条评论

立即
投稿
返回
顶部