// 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回印刷されていますか?わたしにはできる。 – Xufox
後者は期待通りに動作します。 'console.log()'は 'print()'よりもデバッグのための良い選択肢でしたが、 –
あなたが期待した結果を得てうれしいです。しかし、はい、私は文字列を取得している "コールバックは楽しいです!" 3回印刷される。うーん..今私はなぜあなたと違う結果を得るのか困惑しています。 私はおそらくUbuntu604にいると言えばいいですし、Spidermonkey JSシェルにバージョンJavaScript-C24.2.0をインストールしました。違いがあるかどうかは分かりません。 – elouie99