范围调用函数内部的函数

Mer*_*eru 24 javascript scope function

希望有人找到时间来解释函数和范围中的函数.我试图更多地了解变量的函数和范围,并找到了一个相当不错的教程,但这部分我只是没有得到.

任务:

创建一个像这样工作的函数sum:sum(a)(b) = a+b并接受任意数量的括号.例子:

sum(1)(2) == 3
sum(5)(-1)(2) == 6
Run Code Online (Sandbox Code Playgroud)

解决方案:

function sum(a) {

    var sum = a;

    function f(b){
        sum += b;
        return f;
    }

    f.toString = function() { return sum };

    return f;         //line 12
}

alert( sum(1)(2) );   // 3e
Run Code Online (Sandbox Code Playgroud)

说明:

要使sum(1)可调用为sum(1)(2),它必须返回一个函数.该函数可以被调用或转换为数字valueOf.解决方案真的不言自明:

我的解释:

ffunction f(b)返回到范围,该范围是从管线02 - 12 ff.toString,为当前返回ffunction(b) 接下来return f返回到其是功能以外的范围sum(a).

问题:

我无法弄清楚,我需要以不同的方式思考,因为就像我上面所描述的那样,函数不会被再次调用,那么代码的哪一部分可以使"几个括号"成为可能?

而且,我是否正确地假设fs返回的位置?如果有人会给出一些解释,那将会很棒.

aps*_*ers 7

该函数sum返回一个函数,我们称之为f.

该函数f还返回一个函数:实际上,函数f返回自身.

当函数f在其中定义时sum,它可以永久访问范围链中当前可见的所有变量.这里,它包括本地定义的变量sum(本地运行总计)和f(函数本身).("闭包"就是我们所说的功能代码f及其所有范围内变量.)

因为f返回自己,你可以f重复调用链接:

var this_is_f = sum(1);
var same_f_again = this_is_f(2);
var f_a_third_time = same_f_again(3);
Run Code Online (Sandbox Code Playgroud)

或者干脆:

sum(1)(2)(3);
Run Code Online (Sandbox Code Playgroud)

重要的是要注意,在我的第一个例子中,我没有创建新的功能; 相反,我只是引用具有三个不同标识符的完全相同的函数对象.

每次调用sum都会在其范围内创建一个f全新的本地sum(这里,我指的sum是在名为函数的第一行定义的本地sum).但是,调用函数sum不会破坏任何旧函数f,因为每次调用都会sum实例化一个新函数f(并且f对之前调用时创建的任何其他函数一无所知sum).这样,你可以运行多个标签:

var first_tally = sum(1)(2);   // first: 3
var second tally = sum(4)(5);  // second: 9
first_tally(3);   // first: 6
second_tally(6);  // second: 15
Run Code Online (Sandbox Code Playgroud)

你能够随时看到有意义的结果的原因是它会f玷污它的价值sum,而不是向你展示它的源代码.