- [1] 【[[数学]]・[[計算機]]】 [[関数]]。 - [2] [[機能]]。 [3] [CITE@ja[無限リストと遅延評価: Days on the Moon]] ([TIME[2008-10-19 11:36:30 +09:00]] 版) [4] [CITE[Hawk's W3 Laboratory : JavaScript Notes : JavaScript 深層 : 関数の生成とオブジェクトの結合]] ([TIME[2009-01-04 11:54:28 +09:00]] 版) [6] >関数式は関数宣言に似ていますが「式(Expression)」なので、式を書くことが出来るあらゆる場所に書くことが出来ます。また関数名は省略可能です。 >関数名を指定した場合、その名前はその関数の中からしかアクセスできません。 >;;「スコープに関するその他の話題」で解説したcatchと同じく、一時的なオブジェクトをスコープチェーンに追加することで実現されます。もっともIEやNN 4.Xでは外部からもアクセスできてしまうようですが…。 [5] >私が調べた限りオブジェクトの結合を実装しているのはNN4.XとGeckoベースのブラウザだけでした。これらは「関数本体が同等で、かつスコープチェーンが全く同じ」場合に限り複数の関数を結合(恐らく実際には関数を再利用)しています。以下が確認のコードです。 > [PRE(JS example code)[ var fs = new Array(); for(var i=0; i<2; i++) { fs[i] = function(){ alert(i); }; } if(fs[0]==fs[1]) { alert('結合されています'); } else { alert('結合されていません'); } ]PRE] > NN4.XやGeckoベースのブラウザで実行すると「結合されています」と表示され、IEやOpera,KHTMLなどでは「結合されていません」と表示されます。また以下の2例は仕様上結合が認められているが、実際に結合を行う実装が見あたらない例です。いずれも対象となる関数にはスコープチェインの差異があります(差異が外部から観察できるか=実行結果が異なるかどうかとは無関係)。 > [PRE(JS example code)[ function A() { return function (){ alert('hoge'); }; } var f1 = A(); var f2 = A(); if(f1==f2) { alert('結合されています'); } else { alert('結合されていません'); } ]PRE] > [PRE(JS example code)[ 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('結合されていません'); } ]PRE]