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?
당신이 한 솔루션 : 그 범위가 끝날 때 폐쇄가 정의 기능을 떠날 때
정말 정확하지 않습니다. 실제 "절약"은 진행되지 않으며 복사도 없습니다. "make_closure"내부에서 생성 된 함수는 "x"를 20으로 설정하는 명령문보다 먼저 호출되어야하며 경고에는 "10"이 표시됩니다. – Pointy