web-dev-qa-db-ja.com

ES6 Arrow関数の「引数」に関する公式情報は?

(() => console.log(arguments))(1,2,3);

// Chrome, FF, Node give "1,2,3"
// Babel gives "arguments is not defined" from parent scope

Babel(および最初のTC39の推奨事項から言えること)によると、矢印関数は引数の親スコープを使用する必要があるため、これは「無効」です。これと矛盾することがわかった唯一の情報は、これがTC39によって拒否されたという単一のコメントですが、これを裏付けるものは何も見つかりません。

ここで公式ドキュメントを探しています。

41
Mark Kahn

ここではChrome、FF、ノードが間違っているようです、Babelは正しいです:

矢印関数には、スコープ内に独自のargumentsバインディングがありません。呼び出し時に引数オブジェクトは作成されません。

ここで公式ドキュメントを探しています

アロー関数式は [[ThisMode]]が設定されている からlexicalの関数に評価され、そのような関数が呼び出されると 宣言のインスタンス化 は-を作成しません argumentsオブジェクト 。 「矢印関数には引数オブジェクトがありません。」と明記された特定の注記(18 a)もあります。

43
Bergi

Bergiが指摘したように、矢印関数には独自のarguments変数がありません。

ただし、矢印関数の引数を取得したい場合は、単純に restパラメーター を使用できます。

const myFunc = (...args) =>
  console.log ("arguments", args)
  
myFunc (1, 2, 3)
// arguments [1, 2, 3]

残りのパラメータは他の位置パラメータと組み合わせることができますが、常にlastパラメータとして含める必要があります

const myFunc = (a, b, c, ...rest) =>
  console.log (a, b, c, rest)

myFunc (1, 2, 3, 4, 5, 6, 7)
// 1 2 3 [ 4, 5, 6, 7 ]

残りのパラメーターを他の位置に誤って書き込むと、エラーが発生します。

const myFunc = (...rest, a, b, c) =>
  console.log (a, b, c, rest)
  
myFunc (1, 2, 3, 4, 5, 6, 7)
// Error: Rest parameter must be last formal parameter
41
Thank you