7

根据这个节点样式指南,给闭包起一个名字是一个很好的做法:

正确的

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

错误的

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

然而,我习惯于思考

function someName() { someStatements(); }

...语法作为创建全局变量someNamewindow.someName用于该函数的东西。这真的是一个很好的做法,还是一个非常糟糕的风格指南?

4

4 回答 4

4

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

命名函数表达式在 Internet Explorer 中存在错误,并且会污染窗口对象,如下所述: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

于 2012-09-18T15:24:39.863 回答
3

In node.js, what you describe does not pollute the global context.

Given:

function someName() { someStatements(); }

global.someName will be defined. The following however:

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

Will not set global.someName.

It seems to be just a matter of aesthetics. I tested this with node.js v0.8.4, but the same behaviour should be present in most modern browsers.

于 2012-09-18T15:27:41.147 回答
1

命名闭包的名称只能这个闭包内部访问,因此它永远不会污染全局命名空间。通常你会使用命名的闭包来创建一个递归闭包。

于 2014-10-24T10:25:24.060 回答
0

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

req.on('end', function onEnd() { 
  console.log(onEnd); //function body
}); 
console.log(onEnd); //ReferenceError: onEnd is not defined
于 2012-09-18T15:21:23.367 回答