JavaScript 2.0
根拠
名前付き引数
previousupnext

01/29/2003 (Wed)

名前付き引数は元々 JavaScript 2.0 草案に含まれていたが、JavaScript 2.0 の軽量化のために将来のバージョンに見送られた。実装されるとしたら名前付き引数は本節で述べるような振る舞いをしていた。

[訳注: このドキュメントはコア言語の「関数」から分離されたものである。同ドキュメントも参照すると良い。]

概要

名前付き引数を使用すると、関数に引数を渡すときに、その位置ではなく名前を使って引数を渡すことができるようになる。この名前は単純な文字列である。3つの (名前付き引数に対して) 位置固定引数 (その内1つは省略可能) と4つの名前付き引数を持つ関数宣言は次のようになる:

function f(a: Number, b: Boolean,
  c: Number = 5, named x: Integer = 7,
  named y = null, named z = 34, named t = undefined)

この関数を呼び出すには次のようにする:

f(2, true, y: 5);
f(2, true, 8, z: 32, x: 9);

名前付き引数は常に省略可能でありデフォルト値を持たなければならない。関数呼び出しにおいて、名前付き引数は位置固定引数の後ろに置くことができる。位置固定仮引数は位置固定実引数にのみ一致し、名前付き仮引数は名前付き実引数にのみ一致する。1つの仮引数を位置固定、名前付きの両方にすることはできない。

以下の節では名前付き引数の導入に伴う変更について詳しく説明する。

字句

新しい非予約語 named を追加する。このキーワードは識別子としても正しいものである:

Identifier 
   Identifier
|  get
|  set
|  exclude
|  include
|  named

仮引数リスト

関数の引数は最初に0以上の位置固定引数、その次に1つ以下の残余引数、0以上の名前付き引数、或いは最初に0以上の位置固定引数、その次に1つの名前付き残余引数のいずれかである:

Parameters 
   «empty»
|  NonemptyParameters
NonemptyParameters 
   ParameterInit
|  ParameterInit , NonemptyParameters
|  RestAndNamedParameters
RestAndNamedParameters 
   NamedParameters
|  RestParameter
|  RestParameter , NamedParameters
|  NamedRestParameter
NamedParameters 
   NamedParameter
|  NamedParameter , NamedParameters

個々の引数の形式は次のようになる:

ParameterCore  TypedIdentifierallowIn
Parameter 
   ParameterCore
|  const ParameterCore
ParameterInit 
   Parameter
|  Parameter = AssignmentExpressionallowIn
NamedParameterCore  TypedIdentifierallowIn = AssignmentExpressionallowIn
NamedParameter 
   named NamedParameterCore
|  const named NamedParameterCore
|  named const NamedParameterCore
RestParameter 
   ...
|  ... Parameter
NamedRestParameter 
   ... named Identifier
|  ... const named Identifier
|  ... named const Identifier

Parameter の後に = がある場合、その引数は省略可能である。関数呼び出し時に省略可能な引数に対して実引数を与えなかった場合、この引数には AssignmentExpression の値が設定され、必要に応じて仮引数の型に暗黙の強制型変換される。

仮引数の前に named がある場合、その引数はその位置ではなく名前を使って探索される。名前付き引数は常に省略可能であり、初期化子を持たなければならない。

同じ名前で異なる引数リストを持つ2つの関数を定義するとエラーになる。

名前付き引数を持つ関数がチェック無しの関数になることはない。

残余引数

... がある場合は、関数は仮引数リストのいずれにも合致しなかった実引数を受け取る。仮引数が ... より後方に与えられた場合、その引数の識別子は残りの全ての引数を格納した配列に束縛される。この識別子は引数の型 (デフォルトは Array) で local 宣言される。残余引数が named であればその引数の型は常に Array であり、明示的に型を指定することはできない。

残りの位置固定引数は0から始まる数値の添字を持つ残余配列に要素として格納される。残余引数が named でない場合、名前付き引数が他に残っていてはならない。named であれば名前付き引数は残っていてもよく、残余配列の名前付きプロパティとして格納される。

関数呼び出しの処理手順

以下のリストは関数が呼ばれたときの FunctionDefinition 中のそれぞれの式の評価順序を表したものである。この処理は全ての引数の名前と値が評価された後でのみ行われる。

  1. 関数がチェック無しのものであれば、ローカル変数 arguments を全引数を格納した配列に束縛し名前も付ける。
  2. 関数定義時に最初の引数の TypeExpression を評価した結果として保存されていた型 t を取得する。
  3. 最初の引数が必須のものであり、相当する位置固定引数が無ければエラーを出す。 ただし、関数がチェック無しのものであればエラーとせず、最初の引数に undefined を代入する。
  4. 最初の引数が省略可能であり、相当する位置固定引数があれば、その値をその引数の値として使用する。相当する位置固定引数が無ければ、最初の引数の AssignmentExpression を評価し、その値を最初の引数に代入する。
  5. 最初の引数が名前付き引数であり、その名前付き引数に名前が一致する引数があれば、その値をその名前付き引数の値として使用する。一致するものが無ければ最初の引数の AssignmentExpression を評価し、その値を最初の引数に代入する。
  6. 引数の値 (或いはデフォルト値) を型 t暗黙の強制型変換し、引数の Identifier をその結果に束縛する。
  7. 残りの必須の引数、省略可能な引数、名前付き引数に対して手順2から6を繰り返す。
  8. RestParameter がある状態で名前付き引数が1つ以上残っていればエラーを出す。
  9. RestParameterIdentifier があれば、Identifier を残りの位置固定引数を格納した0からの添字を持つ配列に束縛する。
  10. NamedRestParameter があれば、その Identifier を残りの位置固定引数を格納する0からの添字を持つ配列に束縛し、残りの名前付き引数も名前付きプロパティを使って格納する。
  11. 関数がチェック無しのものでなく、RestParameterNamedRestParameter が1つも無く、まだ引数が残っていればエラーを出す。
  12. 本体を評価する。
  13. 関数定義時に戻り値の TypeExpression を評価した結果として保存されていた型 r を取得する。
  14. 戻り値を型 r暗黙の強制型変換して返す。

関数呼び出し

添字演算子、関数呼び出し演算子である a[args]f(args) は名前付き引数のために以下のように拡張される:

Brackets 
   [ ]
|  [ ListExpressionallowIn ]
|  [ NamedArgumentList ]
Arguments 
   ParenExpressions
|  ( NamedArgumentList )
ParenExpressions 
   ( )
|  ParenListExpression
NamedArgumentList 
   LiteralField
|  ListExpressionallowIn , LiteralField
|  NamedArgumentList , LiteralField

1つの実引数リストには位置固定引数と名前付き引数の両方を含めることができる。位置固定引数はカンマで区切られた部分式の形で ListExpressionallowIn に含められる。名前付き引数にはオブジェクトリテラルと同じ構文を使い、数字だけで構成されるものでなければあらゆる文字列を引数の名前に使うことができるが、同じ名前が2つあってはいけない。名前付き実引数は位置固定実引数の後ろに置かなければならないが、名前付き引数同士の順序はどのようになっていてもよい。


Waldemar Horwat
最終更新: 2003年1月29日 (水)
previousupnext
訳者: exeal <exeal@student.interq.or.jp>
このドキュメントのオリジナルは mozilla.org において英語で公布されています。
この和訳は、利用者の利便のために Mozilla Japan 翻訳部門 によって提供されています。
内容に関してご不明な点がありましたら webmaster までお問い合わせください。