外部函数如何“存储”内部函数的参数?

时间:2014-02-26 08:27:47

标签: javascript function

我在Mozilla开发者页面中找到了这个例子,但是无法理解这个概念。

   function outside(x) {
       function inside(y) {
          return x + y;
       }
       return inside;
    }
    fn_inside = outside(3); //returns inside(y) -- from firebug
    result = fn_inside(5); // returns 8

    result1 = outside(3)(5); // returns 8

似乎3在某种程度上存储在函数“inside”中,并且在第二次调用期间将其添加为5并返回8。

与第一次调用不同,第二次调用外部(outside(3)(5))如何返回值(8)而不是内部函数(inside)?

2 个答案:

答案 0 :(得分:2)

  

似乎3有点存储在'inside'函数中,在第二次调用期间将其添加为5并返回8。

右。每次调用outside都会创建一个新的 inside函数,该函数将调用绑定到outside的数据。它“关闭”了这些数据。这些被称为“闭包”。不要让这个名字困扰你,closures are not complicated

  

与第一次调用不同,第二次调用外部(外部(3)(5))如何返回值(8)而不是内部函数(内部)?

outside 的第二次调用返回一个函数(该调用生成的inside函数);但是你随后用第二对()调用该函数。

该行

outside(3)(5);

...像这样分解:

var f = outside(3); // Create and get the `inside` function bound to 3
f(5);               // Call it, passing in `5`

来自你的评论:

  

所以你的意思是,在outside(3)的第一次调用中,'返回'inside方法定义变为(更改为?)返回3 + y;。是吗?

关闭,但不完全。 x的值未归入inside; inside引用了创建它的上下文,并且该上下文使它可以访问x参数。这些并不完全相同,我们可以看到,如果我们稍微更新一下这个例子(并抛弃数学,这只是模糊了事情):

function outside(name) {
    // 'inside' uses the 'name' argument from the call to 'outside' that created it
    function inside() {
        return name;
    }

    // 'changer' *changes* the 'name' argument's value
    function makeCaps() {
        name = name.toUpperCase();
    }

    // Return both of them
    return {
        inside: inside,
        makeCaps: makeCaps
    };
}

var funcs = outside("foo");
funcs.inside();      // "foo", because 'inside' uses the 'name' created
                     // by the call to 'outside', and that 'name' is
                     // currently "foo"
funcs.makeCaps();    // Changes that same 'name'
funcs.inside();      // "FOO", because that 'name' has been changed

了解insidechanger关闭相同的上下文是关键,这是创建它们的outside调用的上下文。

理解每次调用outside时都会创建新的上下文和新函数也是关键:

var funcs1 = outside("foo");
var funcs2 = outside("separate");
funcs1.inside();     // "foo"
funcs2.inside();     // "separate"
funcs1.makeCaps();
funcs1.inside();     // "FOO"
funcs2.inside();     // "separate"

答案 1 :(得分:0)

您的变量'X'在外部函数的范围内以及您的内部函数。因此,当你调用外部函数时,它会在里面创建新函数并存储你的变量X,然后,当执行对内部函数的调用时,你已经有了X并且只是从它的args中得到了Y.