javascript - 是否为每个嵌套函数创建了一个单独的闭包实例?

标签 javascript

抱歉,如果我的术语有点偏离...当一个函数包装另一个函数并创建一个闭包时,每次调用外部函数时是否都会创建一个新的闭包实例(“内存空间”?)?

根据我的代码,我认为答案是肯定的:

(function(){
  var ob = {}, names=['one', 'two'], i=0;

  var outer = function(val){

    ob[names[i++]] = function(){
      return val;
    };

  };

  outer(3);
  outer(999);

  console.log(ob.one());
  console.log(ob.two());
})();

鉴于结果是

3
999

而不是

999
999

看起来好像 ob.one 指向与 ob.two 不同的闭包实例 - 每个都有自己的 val 值。

难道不仅仅是我的术语让人困惑吗?

最佳答案

Is a seperate closure instance created for each nested function?

是的,这是一个理想的特性

一个更理想的特性是 block 级作用域,这是 javascript 所没有的。事实上,为了在 javascript 中执行嵌套的 for 循环,滥用嵌套函数是必要的,否则变量绑定(bind)将在你背后发生变异(例如,如果你将它交给回调,您自己演示;想象一下您定义的函数是,例如,不同元素的 onClick 处理程序;您将希望绑定(bind)不同)。

当然,如果您不喜欢此功能,您始终可以使用在外部作用域中定义的变量,就像您所做的那样。 =)

关于javascript - 是否为每个嵌套函数创建了一个单独的闭包实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6145921/

相关文章:

javascript - 无法在条件检查时设置 .css() 方法

javascript - 仅在屏幕上运行 JS 功能(不打印)?

javascript - 在 Javascript 类中创建全局变量时出错

javascript - 在 JavaScript 中格式化 document.write() 的输出

Javascript - 在弹出窗口中滚动到底部

javascript - Sequelize : Issue with join table and querying for results

javascript - 通过数据属性选择带有JS的元素,其中包含引号

javascript - netsuite是否支持preventDefault()?

javascript - 用 html javascript 替换奇数和偶数出现

javascript正则表达式匹配单词和后面的数字