[英]Can't understand this simple JavaScript code behavior
下面的函数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)();
您假设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)();
如果我没有被您的逻辑所误解,则可以使用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();
您可以关闭最后一个函数和值。 这将创建一个内部作用域,并且仅在函数创建时具有值。
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)();
.as-console-wrapper { max-height: 100% !important; top: 0; }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.