以下函数make_f(n)试图返回一个函数,以便当用户调用该函数时,它会打印数字n,n-1,..,0。
逻辑是尝试在每次迭代时构建返回函数(f) 但它只打印“ 1”无穷大。为什么会这样,我应该如何解决? 谢谢。
(如果需要,您可以将'write(i)'视为'console.log(i)'。)
function make_f(n) {
var i;
var f;
f = function () { write("0");};
for (i = 1; i <= n ; i++) {
f = function () { write(i.toString()); f();};
}
return f;
}
make_f(10)();
答案 0 :(得分:0)
您假设f()
仍将引用其先前的功能“版本”是无效的,因为f
和i
都在功能范围中定义(使用var
),因此通过从最外部的函数(以及循环内部)返回,f
已经指向自身,并且最终无处可寻。
如果您改用let
,则您的代码将按预期工作(尽管不建议您使用该方法来实现您要实现的目标):
function make_f(n) {
var f = function() { console.log(0); };
for (let i = 1; i <= n ; i++) {
let prev = f;
f = function () { console.log(i); prev();};
}
return f;
}
make_f(10)();
答案 1 :(得分:0)
如果我没有误解您的逻辑,则可以使用yield来完成所需的操作。
function make_f(n) {
let i;
let f = function* (){
for (i = 1; i <= n ; i++){
yield console.log(i.toString());
}
}
return f();
}
let x = make_f(10);
x.next();
答案 2 :(得分:0)
您可以关闭最后一个函数和值。这将创建一个内部作用域,并且仅在函数创建时具有值。
GET /v3.3/me/groups
function make_f(n) {
var i,
f = function () { console.log(0); };
for (i = 1; i <= n ; i++) {
f = function (f, i) {
return function () {
console.log(i);
f();
};
}(f, i);
}
return f;
}
make_f(10)();