>

저는 기사 ( 거미에 대한 자바 스크립트 폐쇄 )를 읽었으며 예제 중 하나는 다음과 같습니다. .

function buildList(list) {
  var result = [];
  for (var i = 0; i < list.length; i++) {
    var item = 'item' + list[i];
    result.push( function() {alert(item + ' ' + list[i])} );
  }
  return result;
}
function testList() {
  var fnlist = buildList([1,2,3]);
  // using j only to help prevent confusion - could use i
  for (var j = 0; j < fnlist.length; j++) {
    fnlist[j]();
  }
}
testList();

testList가 호출되면 "item3 undefined"라는 경고 상자가 나타납니다. 이 기사에는 다음과 같은 설명이 있습니다.

When the anonymous functions are called on the line fnlist[j]();  그들은 모두 동일한 단일 클로저를 사용하며, i와 그 하나의 클로저 내 아이템의 현재 값을 사용합니다 (루프가 완료 되었기 때문에 i의 값은 3이고 item의 값은 'item3'임).

항목의 값이 'item3'인 이유는 무엇입니까? 내가 3이 될 때 for 루프가 끝나지 않습니까? 끝났다면 여전히 'item2'가 아니어야합니까? 아니면 testList가 함수를 호출 할 때 변수 항목이 다시 생성됩니까?


  • 답변 # 1

    가까워 ...

    와이즈 비즈

    예.

    와이즈 비즈

    네 이 예제는 약간 까다 롭습니다. 루프의 마지막 반복 동안

    Why does item have a value of 'item3'? Doesn't the for loop end when i becomes 3?

     2이지만

    If it ends shouldn't item still be 'item2'?

    의 세 번째 요소를 참조합니다.  배열입니다. 즉, i

    와이즈 비즈

    아니요, 당신은 처음에 거의 옳았습니다. 방금 list 를 놓친 것 같아  값은 3입니다.

  • 답변 # 2

    buildList 내의 for 루프는 다음을 수행하기 전에 완료됩니다.

    item == 'item' + list[2] == 'item3'
    
    

    ... 그러므로 그때까지 (각 함수를 호출 할 때) 변수

    Or is the variable item created again when testList calls the functions?

     마지막으로 지정된 항목 (예 : "item3") 및 item[2]   for (var j = 0; j < fnlist.length; j++) { fnlist[j](); } 가 될 것입니다  (마지막 item 의 결과로  작업) 및 i   3 입니다 .

    closure'd함수를 호출하기 전에 루프가 완료된다는 사실과 관련이 있습니다. 이를 방지하기 위해 다음과 같이 새 폐쇄를 만들 수 있습니다.

    i++
    
    

  • 답변 # 3

    네가 놓친 요점은 list[3]   undefined 때문에 미완성  3이고 function buildList(list) { var result = []; for (var i = 0; i < list.length; i++) { var item = 'item' + list[i]; result.push( (function(item, i){ // Now we have our own "local" copies of `item` and `i` return function() { console.log(item + ' ' + list[i]) }; })(item, i) ); } return result; }  0..2에 대해서만 정의됩니다.

  • 답변 # 4

    list[i]  변수는 말한대로 폐쇄에 저장됩니다.

    실제로 당신은 i 에 액세스 할 수 있습니다  변수이지만 list 에 액세스하려고합니다. . 결국, list  변수는 클로저로도 저장되며 값은 3입니다.  함수가 호출됩니다.

  • 답변 # 5

    i가 3이되면 루프가 종료되지만 클로저에 저장되고 경고로 표시되는 "item"변수는

    list
    
    

    텍스트 'item'+ list의 값 [2]. 세 번째 목록 항목은 3이므로 텍스트는 item3입니다

    list[3]

관련 자료

  • 이전 sql - 그룹화 된 행 연결
  • 다음 00은 Java에서 정수 또는 8 진수입니까?