[英]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.