JavaScript:匿名関数と矢印関数の違い

1713 ワード

前言
復習しているうちに、匿名関数と矢印関数はとても似ていることが分かりました.彼らはいったいどんな違いがありますか?
定義
1.一般的な名前付き関数
function abs(x){
    if(x>=0){
        return x;
    }else{
        return -x;
    }
}
上記の関数のように、関数を定義した後に関数にabsのような名前を付けます.呼び出し時に直接abs(-3)で呼び出すだけでいいです.
2.匿名関数
let abs=function(x){ 
    if(x>=0){
        return x;
    }else{
        return -x;
    }
}
上記の関数では、関数に名前を付けることなく、変数absに関数全体を直接与え、呼び出し時にabs(9)でこの関数を呼び出します.
3.矢印関数
名前の通り、矢印関数の定義は矢印です.矢印関数の表面は匿名関数に相当し,関数定義を簡略化した.3.1矢印関数が一つの表式だけを含んでいる場合、それは{…}とreturnさえ省きました.
x => x * x
上の矢印関数は匿名関数に相当します.
function (x) {
    return x * x;
}
3.2矢印関数が式だけを含んでいない場合:
(x,y) => {
    if (x > 0) {
        return x + y;
    }
    else {
        return -x + y;
    }
}
例を引く
var obj1 = {
    birth: 1990,
    getAge: function (year) {   
        let fn=function(y){
            return y - this.birth; // this  window undefined
        };  
        return fn(year); 
    }
};

var obj2 = {
    birth: 1990,
    getAge: function (year) {
        var fn = (y) => y - this.birth; // this.birth 1990
        return fn(year);
    }
};
関数obj 1.getAge(2017)とObj 2.getAge(2017)を呼び出すと同じ結果が得られますか?
obj 1のfn関数は、JavaScriptにおける関数のthisバインディングに関するエラー処理のため、予期された結果が得られず、this.birthはwindowまたはundefinedを指す.
しかし、obj 2、fn関数は矢印関数であり、矢印関数は完全にthisの指向を修復しています.
違います
1.矢印関数はprototype(プロトタイプ)がないので、矢印関数自体にはthisがありません.
let a = () => {};
console.log(a.prototype); // undefined
2.矢印関数内部のthisは語法作用領域であり、文脈によって決定され、thisは定義時に外層から最初の一般関数を継承するthisを指す.関数内のthisオブジェクトは、定義時のオブジェクトであり、使用時のオブジェクトとは関係ありません.