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

时间:2019-07-15 13:46:39

标签: javascript

以下函数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)();

3 个答案:

答案 0 :(得分:0)

您假设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)();

答案 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)();