在下面的例子中JavaScript闭包如何工作?

这个问题在这里已经有了答案:

  • JavaScript关闭如何工作? 88个答案

  • 你需要传入5作为unknown

    关闭完整性的简要定义

    从这个SO链接

  • 闭包是函数的局部变量 - 在函数返回后保持活动状态,或
  • 闭包是一个栈函数,当函数返回时不会解除分配(就好像一个'栈框架'被malloc',而不是在栈上!)。
  • 数字是在JavaScript中传递值

    b传递给自变量a()被保存在封闭该a回报。 所以在你的例子中, b被保存为x2的值。 这是因为JavaScript中的Number是按值传递的。 这意味着,改变x不改变的值b的闭包内a回报。

    简洁的例子:

    var a = function(x) {
      return function() {
        return x + 1;
      };
    };
    var x1 = 1;
    var fn1 = a(x1); // x1 is passed by value, so x inside the closure is its own copy of 1
    x1 = 2 // no effect on the next line
    console.log(fn1()) // prints 2, does NOT print 3

    我听到的最简单的封闭描述是:

    这是一种功能无限期地访问创建环境的方式。

    所以在:

    var a = function(b) {            /* "outer"  aka  "functionofb" */
        return function(c) {         /* "inner"  aka  "functionofc" */
            return y + b + c; 
        } 
    };
    

    我们要看看如何让内部函数无限期地访问变量'b'(的副本),就像它在内部出现时一样。 (在这个例子中,内部函数永远不会改变'b'副本的值,但它可以。)

    因此,通过您的示例,让我们开始在这里:

         x = 2;
    var fn = a(x);
    

    变量a“指向”一个未命名(匿名)函数(用'b'作为arg的函数),所以这基本上是:

    fn = functionofb(x);
    

    要么 :

    fn = functionofb(2);
    

    现在'functionofb'是一个返回函数的函数。 它返回的函数是:

    function(c) { 
        return y + b + c; 
    }
    

    (这也是匿名的,所以我们称之为`functionofc')

    所以:

    function(c) { 
        return y + 2 + c;       /* here 'b's value is 'captured' by the closure */
    }
    

    然后我们有:

    y = 3;
    

    并做:

    fn(5);
    

    这只是:

    functionofc(5);
    

    这给了我们:

    return y + 2 + c;
    

    要么:

    return 3 + 2 + 5;            /* 'y' was never captured, the current value is used */
    

    这是所需的答案:

    10
    

    其他一切都只是红鲱鱼。

    有关JavaScript闭包的更完整讨论,请参阅JavaScript闭包如何工作?


    当你这样做...

    var fn = a(x);
    

    ...变量fn变成等于...

    function(c) { 
        return y + 2 + c; 
    } 
    

    ...因为此时x等于2,并且执行函数ax的值被捕获(固定)。

    所以,当你在运行函数fn那一刻执行变量y等于3的fn(5)时,这意味着函数会执行此操作...

    return 3 + 2 + 5; 
    

    由于3 + 2 + 5 = 10,这意味着你的输出是10。


    注1:

    如果你在y = 3;之前跑了它, fn(5)会返回12 y = 3; ,因为当时y的值是5。 看这个小提琴演示。


    笔记2 :

    有关闭包的更多信息,请参阅此问题:

    JavaScript关闭如何工作?

    链接地址: http://www.djcxy.com/p/1487.html

    上一篇: How does JavaScript closure work in the following example?

    下一篇: JavaScript Functions that return function