練炭ブログ

X680x0、Irvine、DMonkey、Proxomitron などの情報を扱ってます。

X680x0 新着情報

コメントなし»

おっさんホイホイ:「X68000の日」に“レトロPC”が勢ぞろい――あの黄金時代を振り返る (1/3) - ITmedia PC USER

「モコナぷぅ」
UMK3 砂漠ステージ再公開。
SUBZERO Ver0.9 再公開。
SCORPION Ver0.9a 再公開。
SELECT STD2 Ver1.2 公開。

DMonkey: .call()/.apply() の問題点

コメントなし»
// このような関数を
Array.prototype.map = function (callback) {
  ~
};

// このように呼び出すと
Array.prototype.map.call ('foo', function (x) { ~ });

// 以降、map が勝手に fcfCall モードで動作してしまう
var a = [ ~ ].map (function (x) { ~ });

ただ、組み込みメソッドは .call.apply にアクセスしようとするとエラーになるので、DMonkey では「普通の呼び出し方でも .call() または .apply() でも使える」というメソッドはまず見かけません。

今回の例のようにポリフィルを実装するなら、.call.apply は使えないと説明しておけばよいと思います。

var s = new String ('foo');
s.map = Array.prototype.map;

のような呼び出し方であれば問題ないはずです。

なお、関数オブジェクトを this に割り当てようとすると Global に差し替えられるようです(詳細は未調査)。

今回の記事は勢いで書いたのでどこか間違いがあるかも知れないのでご注意下さい。

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 が何になるかは違いが出る)。