JavaScript:匿名関数と矢印関数の違い
1713 ワード
前言
復習しているうちに、匿名関数と矢印関数はとても似ていることが分かりました.彼らはいったいどんな違いがありますか?
定義
1.一般的な名前付き関数
2.匿名関数
3.矢印関数
名前の通り、矢印関数の定義は矢印です.矢印関数の表面は匿名関数に相当し,関数定義を簡略化した.3.1矢印関数が一つの表式だけを含んでいる場合、それは{…}とreturnさえ省きました.
obj 1のfn関数は、JavaScriptにおける関数のthisバインディングに関するエラー処理のため、予期された結果が得られず、this.birthはwindowまたはundefinedを指す.
しかし、obj 2、fn関数は矢印関数であり、矢印関数は完全にthisの指向を修復しています.
違います
1.矢印関数は
復習しているうちに、匿名関数と矢印関数はとても似ていることが分かりました.彼らはいったいどんな違いがありますか?
定義
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
オブジェクトは、定義時のオブジェクトであり、使用時のオブジェクトとは関係ありません.