繁体   English   中英

无法理解这种简单的JavaScript代码行为

[英]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()仍将引用其先前的函数“版本”是无效的,因为fi都在函数范围内定义(使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM