練炭ブログ

萌え壁紙、Irvine、DMonkey、Proxomitron などの情報を扱ってます。

DMonkey: .call()/.apply() の挙動

コメントなし»

Property Accessors (関数オブジェクト以外は省略)

関数オブジェクト . プロパティ名

プロパティ名は prototypecallapply のみ使用できる。

call は関数オブジェクトの動作モードを fcfCall モードに変更し、関数オブジェクト自身を返す。

apply は関数オブジェクトの動作モードを fcfApply モードに変更し、関数オブジェクト自身を返す。

fcfCall モードの関数オブジェクトに対し .apply 演算を行うと fcfApply モードに変更される。逆も同じ。

function a () { }
alert (a === a.call);  // true

function b () { }
alert (b === b.apply);  // true

function c () { }
alert (c.call === c.apply);  // true
alert (c.call.apply.call.apply === c.apply.call.apply.call);  // true

関数オブジェクトを通常モードに戻す手段は、恐らくない。

なお、Bracket notation のつもりで

関数オブジェクト [ "call" ]

と書くと DMonkey の言語仕様により "call" を引数とした関数呼び出しが行われてしまうので、Dot notation でしかアクセスできない。

関数呼び出し

( ) (または [ ])

fcfCall モードの関数を引数付きで呼び出すと .call() の動作が実行される(第1引数が this、あれば第2引数以降が arguments)。

fcfApply モードの関数を引数付きで呼び出すと .apply() の動作が実行される(第1引数が this、あれば第2引数の配列が arguments)。

それ以外、つまり通常モードの関数や fcfCall モードまたは fcfApply モードの関数を引数なしで呼び出した場合は通常の関数呼び出しとして実行される(ただし this が何になるかは違いが出る)。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です