vares6
变量声明提高原则数组
var语句声明的变量的做用域是当前执行位置的上下文函数
给一个非声明变量赋值会隐式建立一个全局变量(全局object的一个属性),注意这里是非声明赋值url
声明和赋值是两回事,注意区分,referenceError和undefinedcode
函数执行时,函数内部的变量才会声明,而且只声明一次,不会重复声明,执行完成后销毁,函数内调用时为调用其引用对象
let作用域
和var不一样,声明能够是块级的,也就是for函数内的n个函数块,let会声明n个变量( 每进入一次for花括号就生成了一个块级域 )get
和var不一样,重复定义会报错typeError 若是在子域内重复声明,是能够的。io
和var不一样,没有变量提高, let声明以前,该变量都是不可用的。称之为: 暂时性死区(temproal dead zone简称 TDZ)console
let 块 提供了一种在块的范围内获取变量的值,而不会影响块外面名字相同的变量的值的方法
var x = 5; var y =0; let(x = x+10, y =12) { //这里隐式建立了一个包围 expr 的语句块。 console.log(x+y);// 27 } console.log(x + y); // 5
用 var 或 let 声明的未赋初值的变量,值会被设定为 undefined
- let声明的变量只在它所在的代码块有效,而非var为函数做用域 - let不会变量声明提早,未声明前使用,直接报错,var不会报错undefined - let回暂时性死区,一旦区块内let声明了a,全局变量a不会在该区块起 - let不容许在相同做用域内,重复声明同一个变量
- 防止内层变量可能覆盖外层变量 - for循环的i变量控制循环,防止泄露
- 使用{}代替当即执行匿名函数(IIFE) - ES5的严格模式规定,函数只能在顶层做用域和函数内声明,其余状况(好比if代码块、循环代码块)的声明都会报错。 - ES6因为引入了块级做用域,这种状况能够理解成函数在块级做用域内声明,所以不报错,可是构成区块的大括号不能少,不然仍是会报错。
const 声明建立一个只读的常量。这不意味着常量指向的值不可变,而是变量标识符的值只能赋值一次。声明同时必须赋值。
- 声明一个只读的常量。一旦声明,常量的值就不能改变,这意味着,const一旦声明变量,就必须当即初始化,不能留到之后赋值。 - const的做用域与let命令相同: 只在声明所在的块级做用域内有效 const命令声明的常量也是不提高 一样存在暂时性死区,只能在声明的位置后面使用 一样不可重复声明 - 对于复合类型的变量(例如对象、数组),变量名不指向数据,而是指向数据所在的地址。 const命令只是保证变量名指向的地址不变,并不保证该地址的数据不变,因此将一个对象声明为常量必须很是当心。 若是真的想将对象冻结,应该使用Object.freeze方法,地址数据也不会变了
- ES6:var/function/let/const/import/class - ES5:var/function
- var命令和function命令声明的全局变量,依旧是全局对象的属性 - let命令、const命令、class命令声明的全局变量,不属于全局对象的属性,eg:`let b = 1; window.b 为undefined`
book url:http://es6.ruanyifeng.com/#do...