2010-03-21 4 views
1

Javascript에서 변수를 복사하는 것에 대한 내 이해를 확인하고 싶습니다. 내가 모은 것에서 변수는 new 연산자로 사본을 생성하도록 명시 적으로 지정하지 않으면 참조로 전달되거나 할당됩니다. 하지만 클로저 사용에 관해서는 약간 확신이 없습니다.Javascript 클로저에서 변수 복사를 제어하는 ​​규칙은 무엇입니까?

var myArray = [1, 5, 10, 15, 20]; 
var fnlist = []; 
for (var i in myArray) { 
    var data = myArray[i]; 
    fnlist.push(function() { 
     var x = data; 
     console.log(x); 
    }); 
} 
fnlist[2](); // returns 20 

내가 fnlist[2] 만이 호출되는 시점에서 data의 값을 보이기 때문에이 것을 수집 : 나는 다음과 같은 코드를 말한다. 그래서 대체 택을 시도했습니다 :

var myArray = [1, 5, 10, 15, 20]; 
var fnlist = []; 
for (var i in myArray) { 
    var data = myArray[i]; 
    fnlist.push(function() { 
     var x = data; 
     return function() { 
      console.log(x);   
     } 
    }()); 
} 
fnlist[2](); // returns 10 

이제 '올바른 값'을 반환합니다. 함수가 호출 될 때 함수가 '상수'값에 대한 모든 변수 참조를 해결하기 때문에 제대로 작동한다고 말할 수 있습니까? 또는 그것을 설명하는 더 좋은 방법이 있습니까?

이 참조/복사 비즈니스에 대한 설명에 대한 설명/링크도 감사하겠습니다. 감사!

function make_closure() { 
    var x = 10; 
    var closure = function() { alert(x) } 
    x = 20 
    return closure; 
} 

func = make_closure() 
func() // what do you think? 

당신이 한 솔루션 : 그 범위가 끝날 때 폐쇄가 정의 기능을 떠날 때

답변

1

폐쇄 변수, 즉, 순간에 (폐쇄에 "저장") 바인딩 찾을 수 있습니다 - 당신은 또 다른 범위를 소개하고 "내부"범위에서 변수를 바인딩하도록 강제 종료합니다.

자세한 내용과 설명은 here을 참조하십시오.

+2

정말 정확하지 않습니다. 실제 "절약"은 진행되지 않으며 복사도 없습니다. "make_closure"내부에서 생성 된 함수는 "x"를 20으로 설정하는 명령문보다 먼저 호출되어야하며 경고에는 "10"이 표시됩니다. – Pointy

관련 문제