2017-10-24 2 views
1

나는 여기 무언가를하고 있다고 확신하지만, 나는 무엇을 확신하지 못한다. 익명 함수를 나중에 실행을 위해 배열에 추가하고 각 반복을 변경하는 변수가있는 for 루프에 익명 함수를 추가합니다. 은 https : server.net/a 은 https : server.net/b익명 함수의 범위 및 외부 변수에 액세스 하시겠습니까?

대신 내가 받고 있어요 :

내가 기록 된 값을 기대하고있어이 될 은 https : server.net/b https : server.net/b

마지막 버전을 덮어 쓰는 기능을 재정의 한 것처럼 보일 수도 있지만 그 이유는 확실하지 않습니다. 각 익명의 기능이 다를 것이라고 생각합니다.

왜? 여기서 내가 뭘 잘못하고 있니?

f = []; 
items = ['a', 'b']; 
for(var i = 0; i < items.length; i++){ 
    var itemID = items[i]; 
    var itemAccessUrl = `https://server.net/${itemID}`; 

    var func = function(){ 
     console.log(itemAccessUrl); 
    }; 
    f.push(func); 
} 

console.log(f.length); 
for(var j = 0; j < f.length; j++){ 
    func(); 
} 
+0

가능한 복제를 호출

f = []; items = ['a', 'b']; for(var i = 0; i < items.length; i++){ var itemID = items[i]; var itemAccessUrl = 'https://server.net/${itemID}'; var func = (function (param) { console.log(param); }).bind(null, itemAccessUrl); f.push(func); } console.log(f.length); for(var j = 0; j < f.length; j++){ f[j](); } 

는 또한 두 번째 루프를 변경해야 [ 루프 내에서의 JavaScript 클로저 - 간단한 실제 예제 (https://stackoverflow.com/questions/750486/javascript-closure-inside-loops-simple-practical-example) – Adam

답변

1

이 때문에 var 범위 지정의 본질이다 :

는 여기에 몇 가지 예제 코드입니다. var은 블록 범위가 아니며, 함수의 맨 위에 선언 한 것처럼 "게양 된"것입니다.

블록 범위 인 var 대신 let을 사용하여 itemAccessUrl을 선언 할 수 있지만 필요한 브라우저 지원에 따라 다릅니다. (템플릿 문자열을 사용하고 있으므로 괜찮을 것입니다.)

+0

itemID 및 itemAccessUrl을 var 대신 사용하도록 변경하면 문제가 계속 발생합니다. func에 대해 변경하면, 나중에 실행할 때 "함수가 정의되지 않았습니다."라는 오류가 발생합니다. 내가 그것을 부를 필요가있는 다른 방법이 있습니까? –

+0

두 번째 for 루프의 줄에 있습니다. 그것을 f [j]();로 변경하십시오. 마찬가지로 루프 내에서 몇 번만 같은 기능을 호출하게 될 것입니다. – user184994

+0

그 트릭을 수행했습니다. 감사합니다! –

1

여기가 어떻게됩니까? 배열의 함수를 호출하면 현재 값 itemAccessUrl, 즉 마지막으로 할당 된 문자열을 char 'b'와 함께 사용합니다. 첫 번째 for-loop 완료 후에 호출이 발생하기 때문입니다.

당신은 폐쇄 사용할 수 있습니다

:

f = []; 
items = ['a', 'b']; 
for(var i = 0; i < items.length; i++){ 
    var itemID = items[i]; 
    var itemAccessUrl = `https://server.net/${itemID}`; 

    var func = (function(param) { 
     return function() { 
      console.log(param); 
     }; 
    })(itemAccessUrl); 
    f.push(func); 
} 

console.log(f.length); 
for(var j = 0; j < f.length; j++){ 
    f[j](); 
} 

또는 현재 PARAM에 기능을 결합 :의 f[j]();

관련 문제