1.es6中的let和const的區別
(1) let
在區域性作用域有效
var a = []; for (var i = 0; i < 10; i++) { a[i] = function () { console.log(i); }; } a[6](); // 10 註釋: 上面程式碼中,計數器i只在for迴圈體內有效,在迴圈體外引用就會報錯。 下面的程式碼如果使用var,最後輸出的是10。 上面程式碼中,變數i是var命令宣告的,在全域性範圍內都有效,所以全域性只有一個變數i。每一次迴圈,變數i的值都會發生改變,而迴圈內被賦給陣列a的函式內部的console.log(i),裡面的i指向的就是全域性的i。也就是說,所有陣列a的成員裡面的i,指向的都是同一個i,導致執行時輸出的是最後一輪的i的值,也就是 10。 如果使用let,宣告的變數僅在塊級作用域內有效,最後輸出的是 6。 var a = []; for (let i = 0; i < 10; i++) { a[i] = function () { console.log(i); }; } a[6](); // 6 上面程式碼中,變數i是let宣告的,當前的i只在本輪迴圈有效,所以每一次迴圈的i其實都是一個新的變數,所以最後輸出的是6。你可能會問,如果每一輪迴圈的變數i都是重新宣告的,那它怎麼知道上一輪迴圈的值,從而計算出本輪迴圈的值?這是因為 JavaScript 引擎內部會記住上一輪迴圈的值,初始化本輪的變數i時,就在上一輪迴圈的基礎上進行計算。 另外,for迴圈還有一個特別之處,就是設定迴圈變數的那部分是一個父作用域,而迴圈體內部是一個單獨的子作用域。 for (let i = 0; i < 3; i++) { let i = 'abc'; console.log(i); } // abc // abc // abc 上面程式碼正確執行,輸出了 3 次abc。這表明函式內部的變數i與迴圈變數i不在同一個作用域,有各自單獨的作用域。
不會存在變數提升
var命令會發生”變數提升“現象,即變數可以在宣告之前使用,值為undefined。這種現象多多少少是有些奇怪的,按照一般的邏輯,變數應該在宣告語句之後才可以使用。 為了糾正這種現象,let命令改變了語法行為,它所宣告的變數一定要在宣告後使用,否則報錯。 // var 的情況 console.log(foo); // 輸出undefined var foo = 2; // let 的情況 console.log(bar); // 報錯ReferenceError let bar = 2; 上面程式碼中,變數foo用var命令宣告,會發生變數提升,即指令碼開始執行時,變數foo已經存在了,但是沒有值,所以會輸出undefined。變數bar用let命令宣告,不會發生變數提升。這表示在宣告它之前,變數bar是不存在的,這時如果用到它,就會丟擲一個錯誤。
變數不能重複宣告
let不允許在相同作用域內,重複宣告同一個變數。 // 報錯 function func() { let a = 10; var a = 1; } // 報錯 function func() { let a = 10; let a = 1; } 因此,不能在函式內部重新宣告引數。 function func(arg) { let arg; // 報錯 } function func(arg) { { let arg; // 不報錯 } }
(2) const
區域性作用域
不會存在變數的提升
變數不能重複宣告 只宣告常量,不可變的量
(3) 模板字串
table鍵上的反引號$(變數名)來實現字串的拼接
egg:
let name = "張三";
let str = `我是${name}`
2.es6的箭頭函式 this的指向發生了改變
方式一:
let add = (x) =>{ return x } console.log(add(20))
方式二: let add2 =x=>: console.log(add2(20))
3.es6的物件
let person ={ name:"張三", age:30, fav:function () { console.log(this.name)//匿名函式this指向當前物件 } } person.fav() let person={ name:'張三', age:20, fav:() => { console.log(this),//指向定義 person的父類(上下文) console.log(this.name) } }
物件的單體模式
let person={
name='張三',
fav (){
console.log(this.name) //指的當前的物件
}
}
person.fav()
//張三
4.es6的類
class person{ constructor(name='alex',age=18){ this.name=name; this.age=age; } showname(){ console.log(this.name) } showage(){ console.log(this.age) } } let v=new person(); v.showname() v.showage()
補充:es5中的函式this指向了使用該函式的物件
var person = { name:'alex', fav:function(){ console.log(this);//person } } person.fav()
-箭頭函式
var person = { name:'alex', fav:()=>{ console.log(this);//window }, showName(){ console.log(this);//person } } person.fav()
有關this指向問題的總結:
--this的指向和vm例項沒有任何的關係,而是與箭頭函式和普通函式的區別
1.es5的普通函式,this指向是指向了呼叫者,比如vue例項的方法(在methods中宣告瞭一個方法)是由vue例項vm呼叫的,所以this指向vm。
2、箭頭函式的this指向它的呼叫者所在的上下文,也就是vm例項所在的上下文(定義vm的父類),即window.