2014-02-26 81 views
1

我在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)?

+1

@elclanrs也许吧。但我甚至不知道OP在这里有什么问题......它可能是*“函数如何存储在变量中?”或*“变量如何工作?”...... –

回答

2

好像3有些存储在“里面”的第二呼叫过程中的作用与5增加了它,并返回8

权。每个呼叫outside创建一个新的inside函数,并且该函数具有绑定到它的呼叫到outside的数据。它“关闭”了这些数据。这些被称为“封闭”。不要让名字打扰你,closures are not complicated

第二次调用outside(outside(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方法od定义变成(改为?)返回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" 
+0

感谢Crowder。现在有点清楚了。那么你的意思是,在第一次调用'outside(3)'的时候,方法定义中的'returned'变成(改成?)'return 3 + y;'。是对的吗? – Bere

+0

@Bere:关闭,但不完全;我在上面添加了进一步的解释。 –

+0

我几乎了解这个概念。最后一个问题:我认为之后例如outer(“foo”)被调用,它已经消失,它的内存被回收...,没有它的痕迹 - 除了返回的值。但从你的答案我明白,通过保持其内在功能,我们实际上可以保留外部函数的“上下文”(变量...)。可以? – Bere

0

你的变量“X”是在外面作用的范围,以及你的内部功能。所以当你调用外部函数时,它会在里面创建新的函数,并且存储变量X,然后,当执行函数内部函数时,你已经有了X,并且从它的参数中获取Y.

相关问题