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...