<html xmlns="http://www.w3.org/1999/xhtml"><head></head><body><section><h1>仕様書</h1><refs xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><ul xmlns="http://www.w3.org/1999/xhtml"><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="2" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[2]</anchor-end> <cite>Web IDL (Second Edition)</cite> (<time>2015-05-27 01:29:33 +09:00</time> 版) <anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="http://heycam.github.io/webidl/#common-Function">http://heycam.github.io/webidl/#common-Function</anchor-external></li></ul></refs></section><section><h1><code class="JS" xml:lang="en">Function</code> (Web IDL)</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="9" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[9]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Web IDL</anchor> の <dfn><code class="JS" xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Function</anchor></code></dfn> は、
任意の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">引数</anchor>を受け取り任意の値を返す<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">コールバック関数</anchor>です <src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="2" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;2</anchor-internal></src>。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="10" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[10]</anchor-end> 次の場面で使われています。<figure class="short list"><ul><li><code class="DOMm" xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">setTimeout</anchor></code></li><li><code class="DOMm" xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">setInterval</anchor></code></li></ul></figure></p></section><section><h1>歴史</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="3" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[3]</anchor-end>
<cite xml:lang="ja">無限リストと遅延評価: Days on the Moon</cite> (<time>2008-10-19 11:36:30 +09:00</time> 版) <anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="http://nanto.asablo.jp/blog/2008/02/02/2596496">http://nanto.asablo.jp/blog/2008/02/02/2596496</anchor-external></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="4" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[4]</anchor-end> <cite>Hawk's W3 Laboratory : JavaScript Notes : JavaScript 深層 : 関数の生成とオブジェクトの結合</cite> (<time>2009-01-04 11:54:28 +09:00</time> 版) <anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="http://web.archive.org/web/20061018193747/www.hawk.34sp.com/stdpls/jsnotes/jssinso/07_functions.html">http://web.archive.org/web/20061018193747/www.hawk.34sp.com/stdpls/jsnotes/jssinso/07_functions.html</anchor-external></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="6" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[6]</anchor-end> </p><blockquote><p>関数式は関数宣言に似ていますが「式(Expression)」なので、式を書くことが出来るあらゆる場所に書くことが出来ます。また関数名は省略可能です。</p><p>関数名を指定した場合、その名前はその関数の中からしかアクセスできません。 </p><comment-p xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">「スコープに関するその他の話題」で解説したcatchと同じく、一時的なオブジェクトをスコープチェーンに追加することで実現されます。もっともIEやNN 4.Xでは外部からもアクセスできてしまうようですが…。 </comment-p></blockquote><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="5" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[5]</anchor-end> </p><blockquote><p>私が調べた限りオブジェクトの結合を実装しているのはNN4.XとGeckoベースのブラウザだけでした。これらは「関数本体が同等で、かつスコープチェーンが全く同じ」場合に限り複数の関数を結合(恐らく実際には関数を再利用)しています。以下が確認のコードです。</p><pre class="JS example code">var fs = new Array();
for(var i=0; i&lt;2; i++) {
   fs[i] = function(){ alert(i); };
}

if(fs[0]==fs[1]) {
   alert('結合されています');
} else {
   alert('結合されていません');
}</pre><p>NN4.XやGeckoベースのブラウザで実行すると「結合されています」と表示され、IEやOpera,KHTMLなどでは「結合されていません」と表示されます。また以下の2例は仕様上結合が認められているが、実際に結合を行う実装が見あたらない例です。いずれも対象となる関数にはスコープチェインの差異があります(差異が外部から観察できるか=実行結果が異なるかどうかとは無関係)。</p><pre class="JS example code">function A() {
   return function (){ alert('hoge'); };
}

var f1 = A();
var f2 = A();

if(f1==f2) {
   alert('結合されています');
} else {
   alert('結合されていません');
}</pre><pre class="JS example code">var objects = [{'foo':'bar'}, {'foo':'hoge'}];
var fs = [];
for(var i=0; i&lt;2; i++) {
   with(objects[i]) {
      fs[i] = function(){ alert(foo); };
   }
}

if(fs[0]==fs[1]) {
   alert('結合されています');
} else {
   alert('結合されていません');
}</pre></blockquote><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="7" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[7]</anchor-end> <cite>JS の再帰 (追試) - 冬通りに消え行く制服ガールは、夢物語にリアルを求めない。 - subtech</cite> (<time>2009-05-02 20:29:09 +09:00</time> 版) <anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="http://subtech.g.hatena.ne.jp/cho45/20090318/1237315752">http://subtech.g.hatena.ne.jp/cho45/20090318/1237315752</anchor-external></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="8" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[8]</anchor-end> <cite xml:lang="en">Web Applications 1.0 r2684 Bring the event handler attribute stuff in line with reality. Make onerror=<em> and .onerror make sense and compatible with legacy content.]]
( (<time>2009-01-21 18:09:00 +09:00</time> 版))
<anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="http://html5.org/tools/web-apps-tracker?from=2683&amp;to=2684">http://html5.org/tools/web-apps-tracker?from=2683&amp;to=2684</anchor-external></em></cite></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="11" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[11]</anchor-end> <cite xml:lang="en">Define .name property for all Function objects. · heycam/webidl@a275e56</cite>
(<time>2016-01-05 11:07:10 +09:00</time> 版)
<anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="https://github.com/heycam/webidl/commit/a275e567f07c23cde20d1c8b1dd50574355c0d74">https://github.com/heycam/webidl/commit/a275e567f07c23cde20d1c8b1dd50574355c0d74</anchor-external></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="12" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[12]</anchor-end> <cite xml:lang="en">Provide hooks for Content Security Policy (CSP) · Issue #450 · tc39/ecma262</cite>
(<time>2016-03-04 10:31:41 +09:00</time> 版)
<anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="https://github.com/tc39/ecma262/issues/450">https://github.com/tc39/ecma262/issues/450</anchor-external></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="13" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[13]</anchor-end> <cite xml:lang="en">Implement 'HostEnsureCanCompileStrings'. · w3c/webappsec-csp@69d9779</cite>
(<time>2016-04-07 11:07:36 +09:00</time> 版)
<anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="https://github.com/w3c/webappsec-csp/commit/69d9779466c93ffd51d057bfb7ef8dc09d2a5353">https://github.com/w3c/webappsec-csp/commit/69d9779466c93ffd51d057bfb7ef8dc09d2a5353</anchor-external></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="14" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[14]</anchor-end> <cite xml:lang="en">Link function objects to ES spec directly. (#387)</cite>
(<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">tobie</anchor>著, <time>2017-07-29 07:07:40 +09:00</time>)
<anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="https://github.com/heycam/webidl/commit/95ffce8553831fa99cbfb3da8db906ba08f2a78f">https://github.com/heycam/webidl/commit/95ffce8553831fa99cbfb3da8db906ba08f2a78f</anchor-external></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="15" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[15]</anchor-end> <cite xml:lang="en">Update definition of function objects to latest ES draft · Issue #280 · heycam/webidl</cite>
(<time>2017-07-29 13:29:03 +09:00</time>)
<anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="https://github.com/heycam/webidl/issues/280">https://github.com/heycam/webidl/issues/280</anchor-external></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="16" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[16]</anchor-end> <cite xml:lang="en">Link function objects to ES spec directly. by tobie · Pull Request #387 · heycam/webidl</cite>
(<time>2017-07-29 13:29:10 +09:00</time>)
<anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="https://github.com/heycam/webidl/pull/387">https://github.com/heycam/webidl/pull/387</anchor-external></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="17" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[17]</anchor-end> <cite xml:lang="ja">もじら組フォーラム <strong>[</strong>One Topic All View / Re<strong>[</strong>7<strong>]</strong>: JavaScriptで関数の内のブロック内の関数定義 / Page: 0<strong>]</strong></cite>
(<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Mozilla-gumi</anchor>著, <time>2017-09-10 16:11:24 +09:00</time>)
<anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="http://forum.mozilla.gr.jp/cbbs.cgi?mode=al2&amp;namber=26867&amp;rev=&amp;&amp;KLOG=171">http://forum.mozilla.gr.jp/cbbs.cgi?mode=al2&amp;namber=26867&amp;rev=&amp;&amp;KLOG=171</anchor-external></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="18" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[18]</anchor-end> <cite xml:lang="en">Editorial: make the type of custom element constructors stricter</cite>
(<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">yuki3</anchor>著, <time>2018-05-30 00:29:26 +09:00</time>)
<anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="https://github.com/whatwg/html/commit/f8bd887aff17a5ffaf8c50c76b937815c92fc5e4">https://github.com/whatwg/html/commit/f8bd887aff17a5ffaf8c50c76b937815c92fc5e4</anchor-external></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="19" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[19]</anchor-end> <cite xml:lang="en">Specify what typeof should return for exotic objects</cite>
(<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">TimothyGu</anchor>著, <time>2019-02-26 00:23:05 +09:00</time>)
<anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="https://github.com/heycam/webidl/commit/5de45d9bc817fb0ce3f498e4ca9c14adbee2d172">https://github.com/heycam/webidl/commit/5de45d9bc817fb0ce3f498e4ca9c14adbee2d172</anchor-external></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="20" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[20]</anchor-end> <cite xml:lang="en">typeof operator and platform objects · Issue #512 · heycam/webidl</cite>
(<time>2019-06-21 17:08:55 +09:00</time>)
<anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="https://github.com/heycam/webidl/issues/512">https://github.com/heycam/webidl/issues/512</anchor-external></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="21" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[21]</anchor-end> <cite xml:lang="en">JavaScript defines typeof fully now</cite>
(<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">annevk</anchor>著, <time>2019-04-11 17:09:00 +09:00</time>)
<anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="https://github.com/heycam/webidl/commit/ed986625a77fad9db2260a4219b9c58d25bb7756">https://github.com/heycam/webidl/commit/ed986625a77fad9db2260a4219b9c58d25bb7756</anchor-external></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="22" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[22]</anchor-end> <cite xml:lang="en">Specify what typeof should return for exotic objects</cite>
(<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">TimothyGu</anchor>著, <time>2019-02-26 00:23:05 +09:00</time>)
<anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="https://github.com/heycam/webidl/commit/5de45d9bc817fb0ce3f498e4ca9c14adbee2d172">https://github.com/heycam/webidl/commit/5de45d9bc817fb0ce3f498e4ca9c14adbee2d172</anchor-external></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="23" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[23]</anchor-end> <cite xml:lang="en">Specify what typeof should return for exotic objects by TimothyGu · Pull Request #640 · heycam/webidl</cite>
(<time>2020-01-12 12:27:29 +09:00</time>)
<anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="https://github.com/heycam/webidl/pull/640">https://github.com/heycam/webidl/pull/640</anchor-external></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="24" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[24]</anchor-end> <cite xml:lang="en">typeof operator and platform objects · Issue #512 · heycam/webidl</cite>
(<time>2020-01-12 12:28:07 +09:00</time>)
<anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="https://github.com/heycam/webidl/issues/512">https://github.com/heycam/webidl/issues/512</anchor-external></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="25" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[25]</anchor-end> <cite xml:lang="en">JavaScript defines typeof fully now by annevk · Pull Request #712 · heycam/webidl</cite>
(<time>2020-01-12 12:33:36 +09:00</time>)
<anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="https://github.com/heycam/webidl/pull/712">https://github.com/heycam/webidl/pull/712</anchor-external></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="26" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[26]</anchor-end> <cite xml:lang="en">Editorial: Remove 'Strict' arg from FunctionCreate call</cite>
(<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">jmdyck</anchor>著, <time>2019-06-19 14:57:02 +09:00</time>)
<anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="https://github.com/whatwg/html/commit/39dd2044f5371cabf4bd9cbb1c24b5a3a08c4166">https://github.com/whatwg/html/commit/39dd2044f5371cabf4bd9cbb1c24b5a3a08c4166</anchor-external></p></section></body></html>