2011-12-22 2 views
2

키 : 함수 쌍을 포함하는지도를 복제하는 기능이 있습니다. 은 각 기능을 호출 기능으로 묶습니다. 자바 범위와 해시

function duplicateFunctionsMap(functionsMap){ 

    var newMap = {}; 

    for (var name in functionsMap){ 

     var originalFunc = functionsMap[name]; 

     newMap[name] = function(){ 
      originalFunc(); 
     } 
    } 

    return newMap; 
} 

이제 중복 맵에있는 항목 중 하나를 실행하려고 항상 마지막에 당신은 변경하지 originalFunc을 방지하기 위해 범위를 도입해야

duplicateFunctionsMap({ 
         first: function(){alert("first");}, 
         last: function(){alert("last");} 
         })["first"](); // outputs "last" 

답변

3

를 호출 밝혀졌습니다. 기능은 새로운 범위를 소개하지만, for 루프는하지 않습니다 :

for (var name in functionsMap){ 
    (function(originalFunc) { 
     newMap[name] = function(){ 
      originalFunc(); 
     }; // <-- add semicolon at end of expression, too 
    })(functionsMap[name]); 
} 
0

을주기 위해 당신은 아마 폐쇄를 만든 당신의 내부. 내부 익명 즉시 실행 기능을

for (var name in functionsMap){ 
    (function(_of) { 
     newMap[name] = _of; 
    }(functionsMap[name])) 
} 

페이지를 만들어이 코드를 시도 또한 javascript closure immediate evaluation

+0

이 경우 익명 함수는 과잉이다. – pimvdb

+0

이것은 함수를 복제하지 않습니다. – Esailija

2

이이에 구백만 중복하지만 여기가 블록 수준 범위가없는 자바 스크립트 .. 간다. 다시 말해 봐.

는 그래서됩니다 : 그렇지 않으면 중복 된 기능을 모두 잃게

newMap[name] = (function (originalFunc) { 
    return function() { 
     return originalFunc.apply(this, arguments); 
    }; 
})(originalFunc); 

을 : 당신이 값을 컨텍스트 인수를 사용하는 함수를 복제 반환 할 경우이 작업을 수행 할 필요가 있음을

function duplicateFunctionsMap(functionsMap) { 

    var newMap = {}; 

    for (var name in functionsMap) { 
     var originalFunc = functionsMap[name]; 

     newMap[name] = (function (originalFunc) { 
      return function() { 
      originalFunc(); 
      }; 
     })(originalFunc); 

    } 

    return newMap; 
} 

주 그 좋은 것들.