2012-09-18 122 views
7

this node style guide,讓倒閉的名稱是一個好習慣:命名閉包是否污染全局/窗口對象?

req.on('end', function onEnd() { 
    console.log('winning'); 
}); 

錯誤

req.on('end', function() { 
    console.log('losing'); 
}); 

不過,我已經習慣了想着

function someName() { someStatements(); } 

...語法就是爲該函數創建全局變量someNamewindow.someName。這是真的一個很好的做法,或者是一個非常糟糕的風格指南?

回答

3

在node.js的更換,你描述不污染全球範圍內問題。

考慮:

function someName() { someStatements(); } 

global.someName將被定義。然而,以下幾點:

setTimeout(function someName() { someStatements(); }, 500); 

請問設置global.someName

這似乎只是一個美學問題。我用node.js v0.8.4測試了這一點,但在大多數現代瀏覽器中應該存在相同的行爲。

0

您不能使用名稱訪問匿名函數(如果函數具有名稱)。它可以在功能體內訪問。所以它不會污染窗戶對象。

req.on('end', function onEnd() { 
    console.log(onEnd); //function body 
}); 
console.log(onEnd); //ReferenceError: onEnd is not defined 
4

雖然你不會有這個問題,節點:

命名函數表達式竊聽在Internet Explorer中,並會污染window對象,因爲這裏說明:http://kangax.github.com/nfe/ 下「的JScript錯誤」

的(並非如此),有趣的是,他們甚至在那些從未執行條件塊創建,如下面的例子:

var f = function g() { 
    return 1; 
}; 
if (false) { 
    f = function g(){ 
    return 2; 
    }; 
} 
g(); // 2 

這就造成在生產現場我,工作,在那裏的jQuery突然用別的東西(https://dev.plone.org/ticket/12583

+1

值得指出的是,此錯誤還會影響爲Windows Script Host編寫的桌面腳本(假設它們是用JavaScript編寫的,又稱爲「JScript」而不是VBScript),因爲WSH和IE使用相同的解釋器。 – ebohlman

+1

我假設這是固定在IE 11因爲當我嘗試運行你的腳本我得到的錯誤「g是未定義的」 – Nilzor

1

命名閉包的名稱只能在的之內訪問,因此它永遠不會污染全局命名空間。 通常你會使用指定的閉包來創建一個遞歸閉包。

相關問題