【发布时间】:2015-08-24 17:24:57
【问题描述】:
就闭包而言,如果只考虑 返回另一个函数的函数,如下例所示。我们如何在运行时以编程方式确定此闭包的深度?
假设这个函数F的深度为2:
function F(a){ // 1
return function G(b){ // 2
return 'something';
}
}
这个函数'H'的深度是3。
function H(a){ // 1
return function(b){ //2
return function(c){} //3
}
}
到目前为止,我已经编写了一些简单的脚本来确定闭包的深度,方法是迭代检查函数的返回类型,直到它返回除函数之外的其他类型。 但我的脚本仅适用于每个嵌套函数不需要参数的情况。见以下代码:
function F(){
return function(){
return function(){
return 1;
}
}
}
function depth(f){
var n = 1;
var ret = f();
while (typeof(ret)=='function'){
ret = ret();
n++;
}
return n;
}
上面的简单函数 depth 正确地确定了 F 的深度为 3。但是,在某些实际情况下,例如以函数为参数并调用它的闭包,我的函数 depth无法处理。
function F2(a,f){
return function(g){
return f(a) + g(a); // This will break my depth function
}
}
*我的问题:有什么方法可以更有效地确定我的闭包深度吗?尤其是在上面提到的某些情况下(将函数作为参数并调用的闭包它)。可以动态处理可能会或可能不会将某些函数作为参数的闭包的通用方法将不胜感激。
P.S.让我缩小范围如下。
- 只考虑纯嵌套函数。
- 每一层嵌套函数总是返回相同的类型。
- 函数的深度是恒定的。
- 没有一个嵌套函数是递归的。
【问题讨论】:
-
评论不用于扩展讨论;这个对话是moved to chat。
标签: javascript closures