おっさんホイホイ:「X68000の日」に“レトロPC”が勢ぞろい――あの黄金時代を振り返る (1/3) - ITmedia PC USER
「モコナぷぅ」
UMK3 砂漠ステージ再公開。
SUBZERO Ver0.9 再公開。
SCORPION Ver0.9a 再公開。
SELECT STD2 Ver1.2 公開。
おっさんホイホイ:「X68000の日」に“レトロPC”が勢ぞろい――あの黄金時代を振り返る (1/3) - ITmedia PC USER
「モコナぷぅ」
UMK3 砂漠ステージ再公開。
SUBZERO Ver0.9 再公開。
SCORPION Ver0.9a 再公開。
SELECT STD2 Ver1.2 公開。
// このような関数を
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
に差し替えられるようです(詳細は未調査)。
今回の記事は勢いで書いたのでどこか間違いがあるかも知れないのでご注意下さい。
関数オブジェクト . プロパティ名
プロパティ名は prototype
、call
、apply
のみ使用できる。
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
が何になるかは違いが出る)。
2014年06月21日の記事を表示しています。