js -- ES6(二)-- let 和 const 命令(根据阮一峰ES6标准入门整理)
2018-01-12 15:26
751 查看
目前正在学习ES6,根据阮一峰的ES6入门2,学到哪更新到哪里,都是基本的知识,复杂的目前还不会,涉及的代码都是亲自运行过的,若发现错误请指正。
ES6声明变量的方法:var、function、let、const、import、class
比较隐蔽的“死区”
报错的原因是,参数 x 的默认值等于 y,而此时 y 还没有声明,属于“死区”
如果需要调用,则要像下面这样处理
注意:在严格模式下,函数只能在顶层作用域和函数内声明,其他情况(比如if代码块、循环代码块)下的声明都会报错
const 命令声明的变量也不能提升,同样存在暂时性死区,只能在声明后使用。
对于引用类型的变量,变量名不指向数据,而是指向数据所在的地址。const 命令只是保证变量名指向的地址不变,并不保证改地址的数据不变
上面的代码中,常量foo储存的是一个地址,指向一个对象。不可变的只是这个地址,即不能把foo指向另一个地址,但对象本身是可变的,依然可以为其添加新属性。
如果想将对象冻结,应该使用Object.freeze方法。
或者
ES6声明变量的方法:var、function、let、const、import、class
二、let 和 const 命令
1、let 命令
基本用法
let 命令用于声明变量,类似于var,但是所声明的变量只在let命令所在的代码块内有效。不存在变量提升
let不像var那样会发生变量提升的现象,所以,变量一定要声明后使用,否则报错console.log(a);//a is not defined let a = 2;
暂时性死区(temporal dead zone 简称:TDZ)
在代码块内,如果存在let 或 const 命令,它所声明的变量就绑定这个区域,不再受外部的影响,只要在声明之前就使用这些变量,就会报错。比较隐蔽的“死区”
function bar(x=y,y=2) { console.log(x); console.log(y); } bar(); //y is not defined
报错的原因是,参数 x 的默认值等于 y,而此时 y 还没有声明,属于“死区”
function bar(x=2,y=x) { console.log(x); console.log(y); } bar();//2、2
不允许重复声明
let 不允许在相同作用域内重复声明同一个变量function bar(a) { let a; } bar();//Identifier 'a' has already been declared
function bar(a) { { let a; } } bar();//不报错
2、块级作用域
外层作用域无法读取内层作用域的变量,同理,块级作用域外部无法调用块级作用域内部定义的函数{ let a = '111'; function f(){ console.log(a); } }; f();//f is not defined
如果需要调用,则要像下面这样处理
let f; { let a = '111'; f = function (){ console.log(a); } } f();
注意:在严格模式下,函数只能在顶层作用域和函数内声明,其他情况(比如if代码块、循环代码块)下的声明都会报错
3、const 命令
const 用来声明常量,一旦声明,其值就不能改变。const 一旦声明,就必须立即初始化,不能留到以后赋值const a; a = 1; console.log(a); //Missing initializer in const declaration
const 命令声明的变量也不能提升,同样存在暂时性死区,只能在声明后使用。
对于引用类型的变量,变量名不指向数据,而是指向数据所在的地址。const 命令只是保证变量名指向的地址不变,并不保证改地址的数据不变
const foo = {}; foo.name = 'bocai'; console.log(foo.name);//baocai foo = {};//Assignment to constant variable.
上面的代码中,常量foo储存的是一个地址,指向一个对象。不可变的只是这个地址,即不能把foo指向另一个地址,但对象本身是可变的,依然可以为其添加新属性。
如果想将对象冻结,应该使用Object.freeze方法。
const foo = Object.freeze({}); foo.name = 'bocai';//不起作用 console.log(foo.name);//undefined
4、跨模块常量
let 声明的变量 和 const 声明的常量只在当前代码块有效。如果想设置跨模块常量,可以采用下面的写法。//constants.js export const A = 1; export const B = 2; //text.js import {A,B} from '../assets/js/constants' console.log(A); console.log(B);
或者
//constants.js const A = 1; const B = 2; export default { A:A, B:B } //text.js import constants from '../assets/js/constants' console.log(constants.A); console.log(constants.B);
相关文章推荐
- 学习阮一峰的ES6(一)let和const命令整理
- js -- ES6(三)-- 变量的解构赋值(根据阮一峰ES6标准入门整理 更新中。。。)
- js -- ES6(一)-- 简介(根据阮一峰ES6标准入门整理)
- JS变量中有var定义和无var定义的区别以及es6中let命令和const命令
- ES6的let和const命令(一)
- let和const命令 — 学习ES6(一)
- 【ES6学习】— (1)ES6简介、let与const命令以及变量的解构赋值
- ES6 之 let 和 const 命令
- ES6的let和const命令
- es6学习-let和const命令
- es6——let和const命令
- ES6(01 基础 let和const命令)
- 对ES6中let与const命令初步了解
- [js高手之路] es6系列教程 - var, let, const详解
- ES6入门——let和const命令
- ES6入门之let 和 const 命令
- ES6之let和const命令
- es6 let 和 const 命令
- es6学习篇之 let和const命令 、变量的解构赋值
- ES6 笔记: 2.let和const命令