ES6中的箭頭函式和普通函式有什麼區別?
1、普通函式中的this總是指向呼叫它的那個物件,
箭頭函式沒有自己的this,他的this永遠指向其定義環境,任何方法都改變不了其指向,如call()、bind()、apply()。(正是因為它沒有this,所以也就不能用作建構函式,也沒有原型物件)
2、箭頭函式不能當作建構函式,也就是說,不能使用new命令,否則會報錯。
3、箭頭函式不能使用yield命令,因此箭頭函式不能用作genertor函式。
4、箭頭函式沒有原型屬性。
5、箭頭函式不能使用argumen物件,該物件在函式體內不存在。如果要用,可以用rest引數代替。
6、變數提升:由於js的記憶體機制,function的級別最高,而用箭頭函式定義函式的時候,需要var(let、const)關鍵字,而var所定義的變數不能得到變數提升。故箭頭函式一定要定義於呼叫之前。
this的指向問題?
1、普通函式中,this指向其函式的直接呼叫者;
2、箭頭函式中,this指向其定義環境,任何方法都改變不了其指向,如call()、bind()等;
3、建構函式中,如果不使用new,則this指向window,如果使用new建立了一個例項,則this指向該例項。
//不使用new指向window
function Person(name){
console.log(this)// window
this.name = name;
}
Person('inwe')
// 使用new
function Person (name) {
this.name = name
console.log(this) // people
self = this
}
var people = new Peron('iwen')
console.log(self === people) //true
//這裡new改變了this指向,將this由window指向Peoson的例項物件people
4、window內建函式中,如setInterval,setTimeout等,其內部的this指向Window。
5、匿名函式的this指向Window。
6、apply()、call()、bind()可以改變this的指向