首页 文章

Javascript关闭澄清?

提问于
浏览
5

正如我读过的文章一样多,我仍然有一些问题 .

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

  • 臭名昭着的循环问题(带有保持号码的每个警报的链接循环)

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

来自here

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

来自here

闭包是函数的局部变量 - 在函数返回后保持活动状态,或者闭包是函数返回时未释放的堆栈帧 . (好像'stack-frame'是malloc'ed而不是堆栈!)

3个问题请:

Question #1

我被告知JS中的所有函数都创建了Closures .

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

我认为关闭工作是这样的:( from here

制作一个外部的“功能制造者”功能 . 在其中声明一个局部变量 . 在外部函数内声明一个内部函数 . 在内部函数中使用外部函数的变量 . 有外部函数返回内部函数运行函数,并将其返回值赋给变量

exmample:

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

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

Question #2

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

看着

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

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

Question #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 如何记住这个 Value ?

请帮我把它弄好 .

1 回答

  • 8

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

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

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

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

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

    闭包在紧接着执行的函数之后继续存在,因为它返回另一个函数,该函数又包含对原始函数中定义的"counter"符号的引用 . 因为返回的函数仍然是"alive",所以闭包必须由运行时系统保留 .

    请注意这里:

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

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

    我想我认为闭包是执行函数效果的一部分,而不是严格地说是一个静态的结构性东西 . 有可能有一个函数有时会创建一个持久的闭包,但并非总是如此 .

相关问题