1. 程式人生 > >ES6中的箭頭函式和普通函式有什麼區別?

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的指向