簡體   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