tl; dr: いいえ!アロー関数と関数宣言/式は同等ではなく、盲目的に置き換えることはできません。
置き換える関数がを使用せずthis
、でもarguments
呼び出されない場合は、new
はい。
頻繁に:それは依存します。アロー関数は関数宣言/式とは異なる動作をするので、まず違いを見てみましょう:
1.語彙this
とarguments
矢印関数には、独自の関数this
やarguments
バインディングはありません。代わりに、これらの識別子は他の変数と同様に字句スコープで解決されます。ことを意味する矢印関数内、ことthis
とarguments
の値を参照this
し、arguments
矢印機能がされている環境で定義された(すなわち、「外部」矢印関数)で:
// Example using a function expression
function createObject() {
console.log('Inside `createObject`:', this.foo);
return {
foo: 42,
bar: function() {
console.log('Inside `bar`:', this.foo);
},
};
}
createObject.call({foo: 21}).bar(); // override `this` inside createObject
// Example using a arrow function
function createObject() {
console.log('Inside `createObject`:', this.foo);
return {
foo: 42,
bar: () => console.log('Inside `bar`:', this.foo),
};
}
createObject.call({foo: 21}).bar(); // override `this` inside createObject
関数式の場合、this
内で作成されたオブジェクトを参照しますcreateObject
。矢印関数場合、this
を意味するthis
のcreateObject
自体。
これによりthis
、現在の環境のにアクセスする必要がある場合に、矢印関数が役立ちます。
// currently common pattern
var that = this;
getData(function(data) {
that.data = data;
});
// better alternative with arrow functions
getData(data => {
this.data = data;
});
これは、アロー関数をやで設定できないことも意味することに注意してください。this
.bind
.call
に慣れていない場合はthis
、以下をお読みください。
2.アロー関数は、で呼び出すことはできません new
ある関数間ES2015区別呼んでいることや機能の構築が可能。関数が構築可能であるならば、それはで呼び出すことができ new
、すなわちnew User()
。関数が呼び出し可能であれば、それなしでnew
呼び出すことができます(つまり、通常の関数呼び出し)。
関数宣言/式によって作成された関数は、構築可能であり、呼び出し可能です。
矢印関数(およびメソッド)は呼び出しのみ可能です。
class
コンストラクタは構築可能です。
呼び出し不可能な関数を呼び出そうとしたり、構成不可能な関数を構築しようとすると、ランタイムエラーが発生します。
これを知って、次のように述べることができます。
交換可能:
this
またはを使用しない関数arguments
。
- で使用される関数
.bind(this)
交換不可:
- コンストラクター関数
- プロトタイプに追加された関数/メソッド(通常使用するため
this
)
- 可変関数(使用する場合
arguments
(下記参照))
あなたの例を使ってこれを詳しく見てみましょう:
コンストラクター関数
アロー関数はで呼び出せないため、これは機能しませんnew
。関数の宣言/式を使い続けるか、を使用しますclass
。
プロトタイプの方法
プロトタイプメソッドは通常this
、インスタンスへのアクセスに使用するため、ほとんどの場合そうではありません。を使用しない場合はthis
、交換できます。ただし、主に簡潔な構文を重視する場合はclass
、その簡潔なメソッド構文で使用します。
class User {
constructor(name) {
this.name = name;
}
getName() {
return this.name;
}
}
オブジェクトのメソッド
オブジェクトリテラルのメソッドについても同様です。メソッドがを介してオブジェクト自体を参照する場合は、this
関数式を引き続き使用するか、新しいメソッド構文を使用します。
const obj = {
getName() {
// ...
},
};
コールバック
場合によります。アウターにエイリアスを付けている場合、this
または使用している場合は、必ず置き換えてください.bind(this)
。
// old
setTimeout(function() {
// ...
}.bind(this), 500);
// new
setTimeout(() => {
// ...
}, 500);
ただし、コールバックを呼び出すコードが明示的にthis
特定の値に設定されている場合、特にjQueryのイベントハンドラーでよくあることであり、コールバックがthis
(またはarguments
)を使用する場合、矢印関数は使用できません。
可変関数
アロー関数には独自のarguments
がないため、単純にアロー関数に置き換えることはできません。ただし、ES2015ではarguments
、restパラメータを使用する代わりの方法が導入されています。
// old
function sum() {
let args = [].slice.call(arguments);
// ...
}
// new
const sum = (...args) => {
// ...
};
関連する質問:
その他のリソース: