1. 程式人生 > >ES6---箭頭函式與function定義函式有什麼區別?在箭頭函式中,this指向,建構函式,變數提升是如何表現的?

ES6---箭頭函式與function定義函式有什麼區別?在箭頭函式中,this指向,建構函式,變數提升是如何表現的?

  • 簡潔
///function定義函式
function aaa(a,b){
    return a+b;
}

///箭頭函式定義函式
var aaa=(a,b)=>{return a+b;}
  • this指向

    function傳統定義的函式,this指向隨著呼叫環境的改變而改變,而箭頭 函式中的指向則是固定不變,一直指向定義環境的。

///function定義函式中的this指向
function aaa(){
    console.log(this)
}
var obj={
    aaa:aaa
};
aaa();//此時輸出window物件
obj.aaa();//此時輸出obj物件


///箭頭函式中的this指向
var aaa=()=>{ console.log(this) }; var obj={ aaa:aaa } aaa();//此時指向window obj.aaa();//此時指向window
  • 建構函式
    箭頭函式固然好用,但是不能用於建構函式,即不能被new一下;
///使用function方法定義建構函式
function per(){
    this.name='aaa';
    this.sex='man'
};
var ming=new per();
console.log(ming); /// {name: "aaa", sex: "man"}


///使用箭頭函式定義建構函式
var per=>{ this.name='bbb'; this.sex='women'; }; var gang=new per(); ///執行便會報錯:Uncaught TypeError: per is not a constructor
  • 變數提升

    由於js的記憶體機制,function的級別最高,而用箭頭函式定義函式的時候,需要var(let const定義的時候更不必說)關鍵詞,而var所定義的變數不能得到變數提升,故箭頭函式一定要定義於呼叫之前!

///function定義函式時候的位置
aaa();//aaa
function aaa(){
    console.log('aaa'
) } ///箭頭函式定義的位置 var aaa=()=>{ console.log('aaa') }; aaa();//aaa bbb();///報錯bbb is not a function var bbb=()=>{ console.log('bbb') }