ES6(一)const与let

来源:互联网 发布:淘宝宝贝去哪里点发货 编辑:程序博客网 时间:2024/05/16 11:07

一  let 命令

(1) let声明的变量在代码块{}中有效

{  let a = 10;  var b = 1;}output:a //ReferenceError: a is not definedb //1
//打印循环计数
//var 声明的变量,通过闭包实现var a = [];for (var i = 0; i < 10; i++) {  a[i] = (function (i) {    console.log(i);  })(i);}a[6](); // 6

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

(2) let不存在变量提升

if (1) {  typeof x;  // ReferenceError  let x;}

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

var tmp = 123;if (true) {  tmp = 'abc'; // ReferenceError  let tmp;}

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

if (true) {  // TDZ开始  tmp = 'abc'; // ReferenceError  console.log(tmp); // ReferenceError  let tmp; // TDZ结束  console.log(tmp); // undefined  tmp = 123;  console.log(tmp); // 123}

(5) 隐蔽的死区分析(函数参数=左边为函数内部声明,右边为函数外部声明)

function bar(x=y, y=2) {  return [x, y];}bar(); // 报错,y在声明前使用。
函数作为参数:
let foo = 'outer';function bar(func = x => foo) {  let foo = 'inner';  console.log(func()); // outer}bar();
以上等同于:
let foo = 'outer';let f = x => foo;function bar(func = f) {  let foo = 'inner';  console.log(func()); // outer}bar(); 

(6) 不允许重复声明(let与let,let与var都不能同时声明一个变量)

// 报错{  let a = 10;  var a = 1;}// 报错{  let a = 10;  let a = 1;}
在函数内部重新声明参数是错误的:
function func(arg) {  let arg; // 报错}
但是增加一层块状作用域就正确了:
function func(arg) {  {    let arg; // 不报错  }}

二   const 命令

(1) const 也用来声明变量,但是声明的是常量。一旦声明,常量的值就不能改变

const PI = 3.1415;PI // 3.1415PI = 3;PI // 3.1415

(2) const 命令只是指向变量所在的地址,引用类型可以改变属性,只要不重新赋值即可

const foo = {};foo.prop = 123;foo.prop// 123
注:想将对象冻结,应该使用 Object.freeze 方法
const foo = Object.freeze({});foo.prop = 123; // 不起作用foo //{}

三 全局对象

(1) 在浏览器环境指的是 window 对象,在 Node.js 指的是 global 对象,为了兼容性,可以使用this.

(2) ES6 规定,var 命令和 function 命令声明的全局变量,属于全局对象的属性;let 命令、const 命令、class 命令声明的全局变量,不属于全局对象的属性。

var a = 1;// 如果在node环境,可以写成global.a// 或者采用通用方法,写成this.awindow.a // 1let b = 1;window.b // undefined
原创粉丝点击