Javascript闭包澄清?

Javascript闭包澄清?,javascript,closures,Javascript,Closures,尽管我读了很多文章,我仍然有一些问题 我已经知道(并理解)闭包的用法,如: 臭名昭著的循环问题(链接循环,每个链接上都有保持编号的警报) 增加的计数器(继续调用函数->提醒增加的数字) 发件人: 内部函数是指外部函数的局部变量 创建闭包 发件人: 闭包是函数的局部变量,在 函数已返回,或者闭包是一个堆栈帧,但它不是 当函数返回时解除分配。(就好像一个“堆栈帧”是 malloc'ed而不是在堆栈上!) 请回答3个问题: 问题1 我被告知JS中的所有函数都创建闭包 什么???如果我用私有变量创建一个

尽管我读了很多文章,我仍然有一些问题

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

  • 臭名昭著的循环问题(链接循环,每个链接上都有保持编号的警报)

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

  • 发件人:

    内部函数是指外部函数的局部变量 创建闭包

    发件人:

    闭包是函数的局部变量,在 函数已返回,或者闭包是一个堆栈帧,但它不是 当函数返回时解除分配。(就好像一个“堆栈帧”是 malloc'ed而不是在堆栈上!)

    请回答3个问题:

    问题1

    我被告知JS中的所有函数都创建闭包

    什么???如果我用私有变量创建一个普通函数,它只会创建一个作用域。不是结束

    我认为闭包是这样工作的:()

  • 制作一个外部“函数生成器”函数
  • 在其中声明一个局部变量
  • 在外部函数中声明内部函数
  • 在内部函数中使用外部函数的变量
  • 让外部函数返回内部函数
  • 运行函数,并将其返回值赋给变量
  • 例如:

    function functionMaker(){
       var x = 1;
       function innerFunction(){
         alert(x);
         x++;
       }
       return innerFunction;
    }
    
    那么为什么他们说每个js函数都创建闭包呢

    问题2

    自调用函数
    又称IEFA-
    立即调用函数表达式
    是否创建闭包

    看着

    (function (a) {
        alert(a);
    })(4);
    
    我没有看到像上面6条规则那样的模式: 外部函数返回内部函数的确切位置在这里?我看不到单词
    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
    是如何记住这个值的


    请帮我把它弄对。

    所有函数调用创建一个闭包。需要注意的重要一点是,闭包是否会持续到函数调用的生命周期之外

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

    var value = (function() {
      return 4;
    })();
    
    然后创建一个闭包,但在函数返回时丢弃。为什么?因为没有对闭包中定义的符号的幸存引用。但在这里:

    var value = function() {
      var counter = 0;
      return function() {
        return counter++;
      };
    }();
    
    闭包在立即执行的函数之后继续存在,因为它返回另一个函数,而该函数又包含对原始函数中定义的“计数器”符号的引用。因为返回的函数仍然是“活动的”,所以闭包必须由运行时系统保留

    请注意,此处:

    var value = function() {
      return function(a) {
        return "hello " + a;
      };
    }();
    
    即使外部立即执行的函数返回函数,该函数也不会引用外部函数中的任何符号,因此无需保留闭包


    我想我想说的是,把闭包看作是执行函数效果的一部分是有帮助的,而不是严格地说是一个静态的、结构化的东西。有一个函数有时可以创建一个持久的闭包,但并不总是这样。

    谢谢。这与我的第三个问题有关吗<代码>超过函数调用的生存期
    ?请记住:JavaScript IIFE必须有括号:
    (function(){})()@WaleedKhan不,那不是真的。只需消除
    函数
    关键字的歧义。在
    =
    表达式的右侧没有歧义,因此括号是不必要的。@Pointy Well在Mobile Safari编辑中似乎是正确的:我站着更正。@RoyiNamir您所有的问题都是相互关联的:-)每个函数调用都创建一个闭包。