closures - JavaScript クロージャ 引数 - ループ内でのJavaScriptのクロージャ-シンプルな実用例

javascript クロージャ メモリリーク / javascript / loops

私の価値観 3
私の価値観 3
私の価値観 3

var funcs = [];
// 3つの関数を作成しましょう
for (var i = 0; i < 3; i++) {
  //そしてそれらをfuncsに保存します
  funcs[i] = function() {
    //それぞれがその値をログに記録する必要があります。
    console.log("My value: " + i);
  };
}
for (var j = 0; j < 3; j++) {
  //そして今度はそれぞれを実行して見てみましょう
  funcs[j]();
}
var buttons = document.getElementsByTagName("button");
// 3つの関数を作成しましょう
for (var i = 0; i < buttons.length; i++) {
  //イベントリスナーとして
  buttons[i].addEventListener("click", function() {
    //それぞれがその値をログに記録する必要があります。
    console.log("My value: " + i);
  });
}
<button>0</button>
<br />
<button>1</button>
<br />
<button>2</button>
// Some async wait function
const wait = (ms) => new Promise((resolve, reject) => setTimeout(resolve, ms));

for (var i = 0; i < 3; i++) {
  // Log `i` as soon as each promise resolves.
  wait(i * 100).then(() => console.log(i));
}
const arr = [1,2,3];
const fns = [];

for(var i in arr){
  fns.push(() => console.log(`index: ${i}`));
}

for(var v of arr){
  fns.push(() => console.log(`value: ${v}`));
}

for(var f of fns){
  f();
}

Quentin



Answer #1
var funcs = {};
for (var i = 0; i < 3; i++) {
  funcs[i] = function(x) {
    console.log('My value: ' + x);
  }.bind(this, i);
}
for (var j = 0; j < 3; j++) {
  funcs[j]();
}
function log(x) {
  console.log('My value: ' + x);
}

var funcs = [];

for (var i = 0; i < 3; i++) {
  funcs[i] = log.bind(this, i);
}

for (var j = 0; j < 3; j++) {
  funcs[j]();
}