Function
(Web IDL)[9] Web IDL の Function
は、
任意の引数を受け取り任意の値を返すコールバック関数です >>2。
[10] 次の場面で使われています。
[3] 無限リストと遅延評価: Days on the Moon ( 版) http://nanto.asablo.jp/blog/2008/02/02/2596496
[4] Hawk's W3 Laboratory : JavaScript Notes : JavaScript 深層 : 関数の生成とオブジェクトの結合 ( 版) http://web.archive.org/web/20061018193747/www.hawk.34sp.com/stdpls/jsnotes/jssinso/07_functions.html
関数式は関数宣言に似ていますが「式(Expression)」なので、式を書くことが出来るあらゆる場所に書くことが出来ます。また関数名は省略可能です。
関数名を指定した場合、その名前はその関数の中からしかアクセスできません。
「スコープに関するその他の話題」で解説したcatchと同じく、一時的なオブジェクトをスコープチェーンに追加することで実現されます。もっともIEやNN 4.Xでは外部からもアクセスできてしまうようですが…。
私が調べた限りオブジェクトの結合を実装しているのはNN4.XとGeckoベースのブラウザだけでした。これらは「関数本体が同等で、かつスコープチェーンが全く同じ」場合に限り複数の関数を結合(恐らく実際には関数を再利用)しています。以下が確認のコードです。
var fs = new Array(); for(var i=0; i<2; i++) { fs[i] = function(){ alert(i); }; } if(fs[0]==fs[1]) { alert('結合されています'); } else { alert('結合されていません'); }NN4.XやGeckoベースのブラウザで実行すると「結合されています」と表示され、IEやOpera,KHTMLなどでは「結合されていません」と表示されます。また以下の2例は仕様上結合が認められているが、実際に結合を行う実装が見あたらない例です。いずれも対象となる関数にはスコープチェインの差異があります(差異が外部から観察できるか=実行結果が異なるかどうかとは無関係)。
function A() { return function (){ alert('hoge'); }; } var f1 = A(); var f2 = A(); if(f1==f2) { alert('結合されています'); } else { alert('結合されていません'); }var objects = [{'foo':'bar'}, {'foo':'hoge'}]; var fs = []; for(var i=0; i<2; i++) { with(objects[i]) { fs[i] = function(){ alert(foo); }; } } if(fs[0]==fs[1]) { alert('結合されています'); } else { alert('結合されていません'); }
[7] JS の再帰 (追試) - 冬通りに消え行く制服ガールは、夢物語にリアルを求めない。 - subtech ( 版) http://subtech.g.hatena.ne.jp/cho45/20090318/1237315752
[8] Web Applications 1.0 r2684 Bring the event handler attribute stuff in line with reality. Make onerror= and .onerror make sense and compatible with legacy content.]] ( ( 版)) http://html5.org/tools/web-apps-tracker?from=2683&to=2684
[11] Define .name property for all Function objects. · heycam/webidl@a275e56 ( 版) https://github.com/heycam/webidl/commit/a275e567f07c23cde20d1c8b1dd50574355c0d74
[12] Provide hooks for Content Security Policy (CSP) · Issue #450 · tc39/ecma262 ( 版) https://github.com/tc39/ecma262/issues/450
[13] Implement 'HostEnsureCanCompileStrings'. · w3c/webappsec-csp@69d9779 ( 版) https://github.com/w3c/webappsec-csp/commit/69d9779466c93ffd51d057bfb7ef8dc09d2a5353
[14] Link function objects to ES spec directly. (#387) (tobie著, ) https://github.com/heycam/webidl/commit/95ffce8553831fa99cbfb3da8db906ba08f2a78f
[15] Update definition of function objects to latest ES draft · Issue #280 · heycam/webidl () https://github.com/heycam/webidl/issues/280
[16] Link function objects to ES spec directly. by tobie · Pull Request #387 · heycam/webidl () https://github.com/heycam/webidl/pull/387
[17] もじら組フォーラム [One Topic All View / Re[7]: JavaScriptで関数の内のブロック内の関数定義 / Page: 0] (Mozilla-gumi著, ) http://forum.mozilla.gr.jp/cbbs.cgi?mode=al2&namber=26867&rev=&&KLOG=171
[18] Editorial: make the type of custom element constructors stricter (yuki3著, ) https://github.com/whatwg/html/commit/f8bd887aff17a5ffaf8c50c76b937815c92fc5e4
[19] Specify what typeof should return for exotic objects (TimothyGu著, ) https://github.com/heycam/webidl/commit/5de45d9bc817fb0ce3f498e4ca9c14adbee2d172
[20] typeof operator and platform objects · Issue #512 · heycam/webidl () https://github.com/heycam/webidl/issues/512
[21] JavaScript defines typeof fully now (annevk著, ) https://github.com/heycam/webidl/commit/ed986625a77fad9db2260a4219b9c58d25bb7756
[22] Specify what typeof should return for exotic objects (TimothyGu著, ) https://github.com/heycam/webidl/commit/5de45d9bc817fb0ce3f498e4ca9c14adbee2d172
[23] Specify what typeof should return for exotic objects by TimothyGu · Pull Request #640 · heycam/webidl () https://github.com/heycam/webidl/pull/640
[24] typeof operator and platform objects · Issue #512 · heycam/webidl () https://github.com/heycam/webidl/issues/512
[25] JavaScript defines typeof fully now by annevk · Pull Request #712 · heycam/webidl () https://github.com/heycam/webidl/pull/712
[26] Editorial: Remove 'Strict' arg from FunctionCreate call (jmdyck著, ) https://github.com/whatwg/html/commit/39dd2044f5371cabf4bd9cbb1c24b5a3a08c4166