为什么我得到这个闭包的值“结果”?

时间:2012-08-28 18:58:06

标签: javascript closures memoization

假设我有这个代码(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() {}参数的值?

3 个答案:

答案 0 :(得分:2)

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

在您声明之前,您正在记录name。所以它改为使用window.name

答案 1 :(得分:2)

… = function() {
    // …
    console.log('in module:', name);  // <---------- "in return: result"     
    return function(name) {…};
}();

您会看到,在该立即执行的匿名函数表达式的范围内,没有变量“name”。因此,将使用全局变量window.name - 在您的情况下它的值似乎是"result"(jsfiddle目标iframe的名称) - 尝试unwrapped page,它将记录一个空字符串。

答案 2 :(得分:0)

仅供参考......“结果”在此示例中,是JsFiddle中右下方窗口(div / iframe)的名称(或更好说的ID)...

所以@ Rocket &amp; @ Bergi 已经说过......你得到了“window.name”