命名闭包是否污染了全局/窗口对象?
根据这个节点风格指南 ,给封闭一个名字是一个好的做法:
对
req.on('end', function onEnd() { console.log('winning'); });
错误
req.on('end', function() { console.log('losing'); });
不过,我已经习惯了
function someName() { someStatements(); }
…语法作为为该函数创build全局variablessomeName
或window.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