7

このノードスタイルガイドによると、クロージャに名前を付けることは良い習慣です。

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

間違い

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

しかし、私は

function someName() { someStatements(); }

...グローバル変数を作成するものとしての構文、someNameまたはwindow.someNameその関数の構文。これは本当に良い習慣ですか、それとも非常に悪いスタイルガイドですか?

4

4 に答える 4

4

ノードではこの問題は発生しませんが、次のようになります。

名前付き関数式はInternetExplorerでバグがあり、ここで説明されているように、ウィンドウオブジェクトを汚染します: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

node.jsでは、記述した内容がグローバルコンテキストを汚染することはありません

与えられた:

function someName() { someStatements(); }

global.someName定義されます。ただし、次のとおりです。

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

設定されませglobal.someName

それは美学の問題のようです。これをnode.jsv0.8.4でテストしましたが、最近のほとんどのブラウザーでも同じ動作が見られるはずです。

于 2012-09-18T15:27:41.147 に答える
1

名前付きクロージャの名前は、このクロージャでのみアクセスできるため、グローバル名前空間を汚染することはありません。通常、名前付きクロージャを使用して再帰的クロージャを作成します。

于 2014-10-24T10:25:24.060 に答える
0

nameを使用して無名関数にアクセスすることはできません(関数に名前がある場合)。関数本体内でアクセスできます。したがって、ウィンドウオブジェクトを汚染することはありません。

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