ES2015で名前付き矢印関数を作成するにはどうすればよいですか?
これは、質問で除外した方法で行います。これは、割り当てまたはプロパティ初期化子の右側に配置します。変数またはプロパティ名は、JavaScriptエンジンによって名前として合理的に使用できます。何もありませんその他のそれを行うための方法は、それをやってすることは正しいと完全仕様で覆われています。
仕様によると、この関数には本当の名前がありますsayHello
。
var sayHello = name => {
console.log(name + ' says hello');
};
これは、代入演算子>ランタイムセマンティクス:抽象操作を呼び出す評価で定義されています。SetFunctionName
を呼び出します(その呼び出しは現在ステップ1.e.iiiにあります)。
同様に、ランタイムセマンティクス:PropertyDefinitionEvaluationが呼び出されるSetFunctionName
ため、この関数に本当の名前が付けられます。
let o = {
sayHello: name => {
console.log(`${name} says hello`);
}
};
最近のエンジンは、そのようなステートメントの関数の内部名をすでに設定しています。Edgeには、name
ランタイムフラグの背後にある関数インスタンスのように、それを使用可能にするビットがまだあります。
たとえば、ChromeまたはFirefoxでWebコンソールを開き、次のスニペットを実行します。
"use strict";
let foo = () => { throw new Error(); };
console.log("foo.name is: " + foo.name);
try {
foo();
} catch (e) {
console.log(e.stack);
}
Chrome 51以降とFirefox 53以降(および実験的なフラグを設定したEdge 13以降)では、それを実行すると次のように表示されます。
foo.nameは:foo
エラー
at foo(http://stacksnippets.net/js:14:23)
http://stacksnippets.net/js:17:3
注意してくださいfoo.name is: foo
とError...at foo
。
Chrome 50以前、Firefox 52以前、および実験的フラグのないEdgeでは、Function#name
(まだ)プロパティがないため、代わりにこれが表示されます。
foo.nameは:
エラー
at foo(http://stacksnippets.net/js:14:23)
http://stacksnippets.net/js:17:3
には名前がありませfoo.name is:
んが、スタックトレースに表示されることに注意してください。関数にname
プロパティを実際に実装することが、他のいくつかのES2015機能よりも優先度が低かっただけです。ChromeとFirefoxは現在それを持っています。Edgeはフラグの後ろにそれを持っています、おそらくそれはフラグの後ろにそれほど長くはないでしょう。
明らかに、私はそれを定義した後でのみ、この関数を使用できます
正しい。矢印関数には関数宣言構文はなく、関数式構文のみがあり、古いスタイルの名前付き関数式(var f = function foo() { };
)の名前に対応する矢印はありません。したがって、以下に相当するものはありません。
console.log(function fact(n) {
if (n < 0) {
throw new Error("Not defined for negative numbers");
}
return n == 0 ? 1 : n * fact(n - 1);
}(5)); // 120
あなたはそれを2つの表現に分解する必要があります(とにかくそれをするべきだと私は主張します):
let fact = n => {
if (n < 0) {
throw new Error("Not defined for negative numbers.");
}
return n == 0 ? 1 : n * fact(n - 1);
};
console.log(fact(5));
あなたがあればもちろん、持っている単一の式が要求される場合にこれを入れて、あなたは常に...矢印機能を使用することができます。
console.log((() => {
let fact = n => {
if (n < 0) {
throw new Error("Not defined for negative numbers.");
}
return n == 0 ? 1 : n * fact(n - 1);
};
return fact(5);
})()); // 120
それはすばらしいことではありませんが、1つの式ラッパーが確実に必要な場合は機能します。