ES2015の矢印機能は、より簡潔な構文を提供します。
例:
コンストラクタ関数
function User(name) {
this.name = name;
}
// vs
const User = name => {
this.name = name;
};
試作方法
User.prototype.getName = function() {
return this.name;
};
// vs
User.prototype.getName = () => this.name;
オブジェクト(リテラル)メソッド
const obj = {
getName: function() {
// ...
}
};
// vs
const obj = {
getName: () => {
// ...
}
};
コールバック
setTimeout(function() {
// ...
}, 500);
// vs
setTimeout(() => {
// ...
}, 500);
可変関数
function sum() {
let args = [].slice.call(arguments);
// ...
}
// vs
const sum = (...args) => {
// ...
};
tl; dr:No!矢印関数と関数宣言/式は同等ではなく、盲目的に交換することはできません。
置き換えたい関数がnotを使用しない場合(---)this
、arguments
を使用し、new
で呼び出されない場合、はい。
頻繁に:it depend。矢印関数の動作は関数の宣言/式とは異なるため、まず違いを見てみましょう。
1。字句this
およびarguments
矢印関数には、独自のthis
またはarguments
バインディングがありません。代わりに、これらの識別子は他の変数と同様に字句スコープで解決されます。つまり、矢印関数内では、this
とarguments
は、矢印関数が定義されている環境のthis
とarguments
の値を参照しますin(つまり、矢印関数の「外側」):
// 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
of 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
を設定することはnot.bind
または.call
。
this
にあまり詳しくない場合は、読むことを検討してください
2。矢印関数はnew
で呼び出すことはできません
ES2015は、callable関数とconstructable関数を区別します。関数が構築可能な場合、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
)を使用し、あなたはcannot矢印関数を使用します!
可変長関数
矢印関数には独自のarguments
がないため、単純に矢印関数に置き換えることはできません。ただし、ES2015では、arguments
を使用する代わりに restパラメーター を導入しています。
// old
function sum() {
let args = [].slice.call(arguments);
// ...
}
// new
const sum = (...args) => {
// ...
};
関連する質問:
その他のリソース:
変数this
は大きく異なりますtimesCalled
はボタンが呼ばれるたびに1だけインクリメントします。これが私の個人的な質問に答えます。
.click( () => { } )
そして
.click(function() { })
PlnkrのGuidカウントからわかるように、ループで使用すると、両方とも同じ数の関数が作成されます。