2012-09-07 189 views
3

以下兩個塊有什麼區別?javascript匿名函數語法

// block 1 
{ 
    console.log("anonymous block"); 
} 

// block 2 
(function anon() { 
    console.log("anonymous block 2"); 
})(); 

我在Netbeans中運行這個(使用Node.js的插件),他們都似乎工作...

回答

6

不同的是,你可以使用後者的形式來隱藏全局變量,不會破壞他們。

例如,假設您使用jQuery庫,默認情況下,它的主名稱空間的名稱將替換爲$。如果你想使用$用於不同的目的,而不改變$如何正常使用,你可以做這樣的事情:

(function($) { 
    // Use $ without clashing with the jQuery object. 
})(someObject); 

事實上,它也是一個其他的目的。由於undefined不是JavaScript中的保留字,因此可以給它一個值並失去其用途。因此,您可能無法將值傳遞給undefined參數,並且您知道它的行爲正確,不會與全局值發生衝突。

undefined = "some not-undefined value"; // you'd have to be an idiot to do this but I've seen it done 
(function(a, b, undefined) { 
    console.log(typeof(undefined) === "undefined"); // true 
})(someA, someB); 
+0

此外,它也可以在模塊模式中使用。 (見http://stackoverflow.com/a/12325201/129655) –

3

第一個創建的塊與功能不一樣。您可以使用匿名自執行函數來創建本地私有變量並從中返回一個接口。它被稱爲模塊模式。

var Module = (function() { 

    var method = function() { console.log("anonymous block"); }, 
     someOtherMethod = function() {}; 

    return { // return our interface as an object literal 
     method: method, 
     someOtherMethod: someOtherMethod 
    }; 
})(); 

Module.method(); // "anonymous block" 

我們可以調用它,保持變量method,並在全局範圍內隔離someOtherMethod。這是JS中面向對象編程最重要,最有用的特性之一。

+0

很酷的事情是你甚至可以引用私有變量。例如,在你的'方法'中,你可以遞增一個對全局作用域不可見的計數器,並將它用作*可靠的*方法來跟蹤該方法被調用的次數。 –

0

block 1將具有它所在的塊的範圍,設置一個var將覆蓋它在父級,您可以使用let

var a = 2; 
{ 
    var a = 4; 
} 
a; // === 4 

block 2將有全球範圍內但任何由var設置執行完成後會被遺忘。

var a = 2; 
(function(){ 
    var a = 4; 
})(); 
a; // === 2 
+0

Javascript關閉功能/腳本不是塊。 – jholloman

+0

@ jholloman - 我認爲這就是shhac所說的 - 塊沒有定義一個獨立的範圍。 –

+0

是的,它只給出範圍,如果你使用JavaScript中的'let' 1.7 https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Statements/let –