2

モジュールをメモ化することを目的としたこのコード(fiddle )があるとしましょう。

var chat = {
 // Create this closure to contain the cached modules
 module: function() {
    // Internal module cache.
    var modules = {};
     console.log('in module:', name);  // <---------- "in return: result"     
    // Create a new module reference scaffold or load an
    // existing module.
    return function(name) {
      console.log('in return:', name); // <---------- "in return: derp"
      // If this module has already been created, return it.
      if (modules[name]) {
        return modules[name];
      }

      // Create a module and save it under this name
      return modules[name] = { Views: {} };
    };
  }()
};

chat.module("derp");

コードのどこにも「結果」というフレーズは言及されていません。なぜ最初のコンソールログにその値が返されるのでしょうか。

また、宣言nameで何も指定されていない場合、return関数はどのようにしてパラメーターの値を取得しますか?module: function() {}

4

3 に答える 3

2
console.log('in module:', name);

name宣言する前にログに記録しています。window.nameそのため、代わりに使用しています。

于 2012-08-28T19:01:56.280 に答える
2
… = function() {
    // …
    console.log('in module:', name);  // <---------- "in return: result"     
    return function(name) {…};
}();

ご覧のとおり、すぐに実行される無名関数式のスコープには、変数" name"はありません。したがって、グローバル変数window.nameが使用されます-その値"result"はあなたの場合(jsfiddleターゲットiframeの名前)にあるようです-ラップされていないページを試してください、それは空の文字列をログに記録します。

于 2012-08-28T19:04:26.597 に答える
0

参考までに...この例の「result」は、JsFiddleの右下のウィンドウ(div / iframe)の名前(またはより適切にはID)です。

@ Rocket&@ Bergiがすでに言っているように...あなたは「window.name」を取得しています

于 2012-08-28T19:09:57.890 に答える