Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Does named closures pollute the global/window object?

According to this node style guide, giving closures a name is a good practice:

Right

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

Wrong

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

However, I'm used to thinking of the

function someName() { someStatements(); }

...syntax as something that creates a global variable, someName or window.someName for that function. Is this really a good practice, or is that a very bad style guide?

like image 980
kornfridge Avatar asked Sep 18 '12 15:09

kornfridge


2 Answers

Although you will not have this problem with node:

named function expressions are bugged in Internet Explorer, and will pollute the window object, as explained here: http://kangax.github.com/nfe/ under "JScript bugs"

The (not so) funny thing is that they are created even within conditional blocks that are never executed, as in this example:

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

This has created a problem on a production site I worked with, where jQuery suddenly was replaced with something else ( https://dev.plone.org/ticket/12583 )

like image 194
Marco Mariani Avatar answered Sep 24 '22 06:09

Marco Mariani


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.

like image 40
Mahn Avatar answered Sep 24 '22 06:09

Mahn