命名闭包是否污染了全局/窗口对象?

根据这个节点风格指南 ,给封闭一个名字是一个好的做法:

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

错误

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

不过,我已经习惯了

 function someName() { someStatements(); } 

…语法作为为该函数创build全局variablessomeNamewindow.someName东西。 这一个很好的做法,还是一个非常糟糕的风格指南?

       

网上收集的解决方案 "命名闭包是否污染了全局/窗口对象?"

在node.js中,描述的内容不会污染全局上下文

鉴于:

 function someName() { someStatements(); } 

global.someName将被定义。 以下是:

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

不会设置global.someName

这似乎只是一个美学问题。 我用node.js v0.8.4testing了这个,但是在大多数现代浏览器中应该存在相同的行为。

虽然你不会有节点的这个问题:

命名函数expression式在Internet Explorer中被窃听,并且会污染窗口对象,如下所述: http : //kangax.github.com/nfe/在“JScript bugs”

(不那么)有趣的是,它们甚至在从不执行的条件块内创build,如下例所示:

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

这在我与之合作的生产网站上创build了一个问题,在这个网站上,jQuery突然被别的东西替代了( https://dev.plone.org/ticket/12583

命名闭包的名称只能这个闭包内部访问,所以它不应该污染全局的命名空间。 通常你会使用指定的闭包创build一个recursion闭包。

您不能使用名称访问匿名函数(如果函数具有名称)。 它将在function体内被访问。 所以不会污染窗户对象

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