希望有人找到时间来解释函数和范围中的函数.我试图更多地了解变量的函数和范围,并找到了一个相当不错的教程,但这部分我只是没有得到.
任务:
创建一个像这样工作的函数sum:sum(a)(b) = a+b
并接受任意数量的括号.例子:
sum(1)(2) == 3 sum(5)(-1)(2) == 6
解决方案:
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
说明:
要使sum(1)
可调用为sum(1)(2)
,它必须返回一个函数.该函数可以被调用或转换为数字valueOf
.解决方案真的不言自明:
我的解释:
这f
在function f(b)
返回到范围,该范围是从管线02 - 12 f
中f.toString
,为当前返回f
从function(b)
接下来return f
返回到其是功能以外的范围sum(a)
.
问题:
我无法弄清楚,我需要以不同的方式思考,因为就像我上面所描述的那样,函数不会被再次调用,那么代码的哪一部分可以使"几个括号"成为可能?
而且,我是否正确地假设f
s返回的位置?如果有人会给出一些解释,那将会很棒.
该函数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);
或者干脆:
sum(1)(2)(3);
重要的是要注意,在我的第一个例子中,我没有创建新的功能; 相反,我只是引用具有三个不同标识符的完全相同的函数对象.
每次调用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
你能够随时看到有意义的结果的原因是它会f
玷污它的价值sum
,而不是向你展示它的源代码.