《ECMAScript 6 入门》知识点总结7.19

2017-07-19  本文已影响14人  Keiko_Yen

let命令

let作用是声明变量,经常使用在for循环里,声明i

//let声明的变量,只在代码块里有效
        {
            let a=20;
            var b=99;
            console.log(a)
        }
            console.log(b)
            console.log(a) //a is not defined

let的特点

1.不存在变量提升

变量提升.png 结果.png

var 在声明变量 c 之前,c 已经存在了只是值为undefined;而 let 没有变量提升这种现象。

2.“暂时性死区”(TDZ):代码块内,使用 let 命令声明变量前,该变量都是不可用的。

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

TDZ.png

ES6 规定暂时性死区和let、const语句不出现变量提升
暂时性死区的本质就是,只要一进入当前作用域,所要使用的变量就已经存在了,但是不可获取,只有等到声明变量的那一行代码出现,才可以获取和使用该变量。

3.不允许重复声明变量

function a(x){
  let x   //Uncaught SyntaxError: Identifier 'x' has already been declared
}
function b(x) {
  {
    let x  // 不报错
  }
}

4.let 提供了一种块级作用域
ES5 只有全局作用域和函数作用域,ES6新增了块级作用域。

ES6 允许块级作用域的任意嵌套。
内层作用域可以定义外层作用域的同名变量。
块级作用域的出现,实际上使得获得广泛应用的立即执行函数表达式(IIFE)不再必要了。

 {{{{{{{{let age=90;console.log(age)}}}}}}}}  //90
 {{{{{{{{{let age=90}console.log(age)}}}}}}}} 
  //Uncaught ReferenceError: age is not defined 块级作用域
  // 以前的IIFE 
  (function(){
        temp=333;
   })()
   console.log(temp)    //333
  //现在使用let可以这样写
   {
        let temp=333
   }

const

const声明常量,一旦声明,必须立即赋值,并且值不能改变。

const num;      //Uncaught SyntaxError: Missing initializer in const declaration
const num=22;
num=334;        //Uncaught TypeError: Assignment to constant variable.

const的作用域与let命令相同:只在声明所在的块级作用域内有效。
const命令声明的常量也是不提升,同样存在暂时性死区,只能在声明的位置后面使用。
const声明的常量,也与let一样不可重复声明。

注意:const变量值不能改变的原因:指向的内存地址不能改变。

ES5 声明变量的方法(2种):var命令和function命令。
ES6 声明变量的方法(6种):var命令、function命令、let命令、const命令,import命令和class命令。

顶层对象属性和全局变量

var命令和function命令声明的全局变量,依旧是顶层对象的属性;另一方面规定,let命令、const命令、class命令声明的全局变量,不属于顶层对象的属性。

var num1=12;
console.log(window.num1)    //12
let num2=16;
console.log(window.num2)    //undefined
上一篇下一篇

猜你喜欢

热点阅读