2017-11-12 14 views
-1
// Prints 
// Meow! 
// I'm a talking cat! 
// Callbacks are fun! 

function go() { 
    const messages = ["Meow!", "I'm a talking cat!", "Callbacks are fun!"]; 
    let msg = []; 
    for (let i = 0; i < messages.length; i++) { 
     msg.push(function() { 
      print(messages[i]); 
     }); 
    } 
    for (let fct of msg) { 
     fct(); 
    } 
} 
go(); 

// Prints 
// Callbacks are fun! 
// Callbacks are fun! 
// Callbacks are fun! 

function go() { 
    const messages = ["Meow!", "I'm a talking cat!", "Callbacks are fun!"]; 
    let msg = []; 
    for (let message of messages) { 
     msg.push(function() { 
      print(message); 
     }); 
    } 
    for (let fct of msg) { 
     fct(); 
    } 
} 
go(); 

letは変数をブロックスコープにし、変数を宣言するためにvarを使うという欠点を解決することを学びました。すなわち、各反復が変数の異なる値を取り込むことを可能にする。上の私の最初の例のように、これは伝統的なforループで動作します。しかし、私がES6でfor..ofループ構造を使用すると、変数 'message'が関数クロージャの各反復でキャプチャされないことに驚いていました!どうしてこれなの?'For'と 'For-of'ループのブロックスコープ変数

+3

このコードで3番目のメッセージが3回印刷されていますか?わたしにはできる。 – Xufox

+0

後者は期待通りに動作します。 'console.log()'は 'print()'よりもデバッグのための良い選択肢でしたが、 –

+0

あなたが期待した結果を得てうれしいです。しかし、はい、私は文字列を取得している "コールバックは楽しいです!" 3回印刷される。うーん..今私はなぜあなたと違う結果を得るのか困惑しています。 私はおそらくUbuntu604にいると言えばいいですし、Spidermonkey JSシェルにバージョンJavaScript-C24.2.0をインストールしました。違いがあるかどうかは分かりません。 – elouie99

答えて

-1

問題は、あなたが.push()メソッドをどのように使っているのかと思います。 下記のコードを試してください。どちらの構文でも、あなたの配列を正しく記録します。

この場合、varとletはどちらも同じ結果になります。 あなたが宣言したすべての変数が唯一の彼らが宣言されている関数内のスコープを持っています。

function go() { 
const messages = ["Meow!", "I'm a talking cat!", "Callbacks are fun!"]; 
let msg = []; 
for (let i = 0; i < messages.length; i++) { 
    msg.push(messages[i]); 
    }; 

for (let fct of msg) { 
    console.log('for',fct); 
}; 
}; 
go(); 

function go2() { 
const messages = ["Meow!", "I'm a talking cat!", "Callbacks are fun!"]; 
let msg = []; 
for (let message of messages) { 
    msg.push(message); 
}; 
for (let fct of msg) { 
    console.log('for-of', fct); 
}; 
}; 

go2(); 
+0

ありがとう@Gerardはこれで刺すようにしていましたが、私が求めていたものと根本的に異なっていることは、宣言された変数が機能していなかったために関数クロージャの中に変数キャプチャのように見えたということでした。しかし、それは最新のSpidermonkey JSのために働く。 – elouie99

+0

関数を配列にプッシュする際に何か問題はありません。それらを印刷する機能の代わりにメッセージ自体を押すことは同じことではありません。 – Xufox

0

は、私のJSシェルは非常に古くなって判明します。最新のSpiderMonkey 45に移行すると、期待どおりに動作します。

関連する問題