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.解决方案真的不言自明:
我的解释:
这f在function f(b)返回到范围,该范围是从管线02 - 12 f中f.toString,为当前返回f从function(b)
接下来return f返回到其是功能以外的范围sum(a).
问题:
我无法弄清楚,我需要以不同的方式思考,因为就像我上面所描述的那样,函数不会被再次调用,那么代码的哪一部分可以使"几个括号"成为可能?
而且,我是否正确地假设fs返回的位置?如果有人会给出一些解释,那将会很棒.
该函数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,而不是向你展示它的源代码.
| 归档时间: |
|
| 查看次数: |
1795 次 |
| 最近记录: |