functionについて
2010/05/21(金) 15:55 Javascript親記事へこのエントリーをはてなブックマークに追加

JavaScript のブロックスコープと名前空間 « Mozilla Developer Street (modest)
での
  • b. 無名関数の関数スコープ変数をモジュール変数として利用する (古典) (function(){)()}
  • c. 無名コンストラクタの関数スコープ変数をモジュール変数として利用する new function(){}
についてから。
// Greasemonkeyでよく見かける
(function(){})()
// と
// jQueryで使われてるらしい
new function(){}
の違いという話になった場合、両方ともその場での中が評価されてるが、thisの値が異なることに注意
[JavaScript](function() )()とnew function() の違いがわかった / LiosK-free Blog
(function() {
    console.log(this);    // window
})();
new function() {
    console.log(this);    // [Object]
};
newキーワードの動作を簡単に見ると
  1. 真新しい空のオブジェクトを作る
  2. 作ったオブジェクトのプロパティをセットする
  3. thisが示すものを作ったオブジェクトにする。
  4. returnする。
(詳しくはこちらを JavaScript の new 演算子の意味: Days on the Moon )
となっているので、new function()の場合はthisがその場で作ったオブジェクトを示すため、もう一方とは違いwindowオブジェクトを示さない。(new functionの方が安全なのかなー)
new functionの場合でも引数は渡せるので、よく見かけるdocumentのエイリアスはこう書ける。
(function(doc) {
    p(doc);    // document
})(document);
new function(doc) {
    p(doc);    // document
}(document)
ついでに、new func()というのはfuncを引数なしでnewするという意味で、func()という実行した結果をnewするという意味ではないそうだ。
JavaScript Syntax探訪 - 枕を欹てて聴く
この例はイマイチ。
function func(doc) {
        console.log(this); // 1
        return function(){
            console.log(doc);     // document
        }
}
var a = func(document);  // 1で出されるのはwindow
var b = new func(document); // 1で出されるのはObject
(a() == b()) // true
次に無名関数をその場で実行しようと考えたときに
(function())()
//と
function()() // 結論から言うと意味が違う
の違いについて。
これを見ると分かったような分からない感じがする。
(function(){)() と function()() - IT戦記}
function文という用語は意味が分かりづらいので関数宣言としておきましょう。

上手くまとめられなかったので下の記事を読みましょう。
function から始まるとそれは関数宣言と見なされるため、
>|
function () , alert("書けない")
|<
というように関数宣言の後ろに続けて書く事はsyntax errorになる。
functionから始めなければ、JavaScriptは左から順番に評価されていくので続けて書ける。
>|
new function (), alert("書ける")
|<
つまり文の先頭がfunctionじゃなければ、関数宣言(function文)とならずfunction式となる。
>|
function()() // syntax error
new function (), function()() // エラーにならない
|<

function ~ が式になるか文になるかはどうやって決まる? - blanket log
上の記事のきちっとした補足
JavaScriptのfunction文とfunction式を考えてみる - webアプリの開発日記
文と式の違い
(function() ...)() の個人的な解釈 - hogehoge
(function() ...)での()はよく使う演算を優先させる演算子ではないという話。
(function() {)()とかnew function() とか - World Wide Wonderful}

今回みたいな(){}のはググれないのではてなウェブ検索を使うと便利だよ。

名前:  非公開コメント   

  • TB-URL  http://efcl.info/adiary/041/tb/