Javascript关闭澄清?

时间:2012-11-21 14:59:48

标签: javascript closures

和我读过的文章一样,我还有一些问题。

我已经知道(并理解)关闭的用法,如:

  1. 臭名昭着的循环问题(每个人都保持号码的警报链接循环)

  2. 增加了计数器(继续调用函数 - >警告增加的数字)

  3. 来自here

      

    内部函数引用其外部函数的局部变量   创建闭包

    来自here

      

    一个闭包是一个函数的局部变量 - 在之后保持活着   函数已返回,或者闭包是否为堆栈框架   函数返回时释放。 (好像是'堆叠框架'   malloc'ed而不是在堆栈!)

    请提出3个问题:

    问题#1

    我被告知JS中的所有功能都会创建Closures。

    什么 ???如果我用私有变量创建一个普通函数,它只是创建一个范围。没有关闭。

    我认为关闭工作如下:(from here

      
        
    1. 制作一个外部的“功能制造者”功能。
    2.   
    3. 在其中声明一个局部变量。
    4.   
    5. 在外部函数内声明一个内部函数。
    6.   
    7. 在内部函数中使用外部函数的变量。
    8.   
    9. 让外部功能返回内部功能
    10.   
    11. 运行该函数,并将其返回值分配给变量
    12.   

    例如:

    function functionMaker(){
       var x = 1;
       function innerFunction(){
         alert(x);
         x++;
       }
       return innerFunction;
    }
    

    那么为什么他们说每个js函数都会创建闭包?

    问题#2

    Self-Invoking Functions又称IEFA - Immediately Invoked Function Expression会创建一个闭包吗?

    看着

    (function (a) {
        alert(a);
    })(4);
    

    我没有从上面看到类似 6规则的模式: Have the outer function return the inner function 到底在哪里?我没有看到return这个词。

    问题#3

    function myFunction() {
      var myVar = 1;
      var alertMyVar = function () {
        alert('My variable has the value ' + myVar);
      };
      setTimeout(alertMyVar, 1000 * 3600 * 24);
    }
    myFunction();
    

    这里myFunction一整天都活着吗?或者setTimeout之后很快就结束了?如果是这样,SetTimeOut 如何记住该值?

    请帮助我做对。

1 个答案:

答案 0 :(得分:8)

所有功能调用都会创建一个闭包。需要注意的重要一点是闭包是否会持续超出函数调用的生命周期。

如果我执行立即执行的功能:

var value = (function() {
  return 4;
})();

然后创建一个闭包,但在函数返回时被丢弃。为什么?因为在闭包中定义的符号没有幸存的引用。但是在这里:

var value = function() {
  var counter = 0;
  return function() {
    return counter++;
  };
}();

闭包在紧接着执行的函数之后继续存在,因为它返回另一个函数,该函数又包括对原始函数中定义的“计数器”符号的引用。因为返回的函数仍然是“活动的”,所以闭包必须由运行时系统保留。

请注意:

var value = function() {
  return function(a) {
    return "hello " + a;
  };
}();

即使外部立即执行的函数返回一个函数,该函数也不引用外部函数中的任何符号,因此不需要保留闭包。

我想我想说的是,将闭包视为执行函数效果的一部分是有帮助的,而不是严格地说是静态的结构性事物。有可能有一个有时创建持久闭包的函数,但并非总是如此。