2014-06-07 1 views
0

다음 코드를 사용하면 객체에서 값을 가져 와서 전역 네임 스페이스에 추가 할 수 있습니다. 이것은 노출 기능에 정의되어변수를 함수 범위/클로저에 추가하십시오. 함수는 window 객체와 같습니다.

function expose(key, obj){ 
    window[key] = obj[key]; 
} 

나는 그래서으로 노출, 변경, 원하는

// before 
map    //undefined 
_.map    // have to use like this 

expose('map', _) 

// after 
map // function 

밑줄에서 같은 맵으로 나는 도서관에서 많이 사용하는 기능을 수행하는 데 사용되었을 수 있습니다 그것은 동일한 일을하지만 종결 만합니다. 이 문제를 해결하는 방법은 제가 말하고자하는 질문입니다.

map //undefined 

(function(){ 
expose('map', {}) 

// map can be used here 
}()) 
// map is still undefined here. 

나는이 경우이 문제가 내가 여기에 요점을 설명하기 위해 단순화 된 버전을 제시 오전 var map = _.map으로 해결 될 수있다 알고있다. 위에 설명 된대로 문제를 해결하고 싶습니다. 한 번에 둘 이상의 변수를 표시하는 함수를 작성할 수 있습니다.

복잡한 예를 보려면이 repo를보십시오. 노출 기능

https://github.com/CrowdHailer/cuminjs

시험은

https://github.com/CrowdHailer/cuminjs/blob/master/spec/cumin_spec.js

대형 예를 들어 내가 최종 결과가

// file one - sets up some core utilities 
var MyModule = (function(){ 
var foo = function(){ 
    // ..some functionality 
}; 

return { 
    foo: foo 
    // plus several more functions 
}; 
}()); 


// file two - sets up some other functionality. 
// Makes use of lots of the functions set up in file 1 
(function(parent){ 
    // var foo = MyModule.foo -trying to avoid as want to use several maybe names change 

    expose([foo, etc], MyModule); 

    var bar = function(){ 
    // .. other code would like to make use of foo 
    }; 

    parent.extend({ 
    bar: bar 
    }); 
}(MyModule)) 
+0

단지 RequireJS (http://requirejs.org/)와 비슷한 것을하려고하십니까? –

+0

나는 requirejs에 대한 많은 경험이 없다. 그러나 비슷한 점이있을 수있는 이음새를 빠르게 읽을 수 있습니다. 요구 사항으로 인해 항목을 클로저에 넣을 수 있습니까? –

+0

모듈 로더가 더 많습니다. 그러나 예. 모듈을 (클로저로) 정의한 다음 코드의 다른 곳에서 의존성으로 "요구"할 수 있습니다. –

답변

0

I로 원하는 것을 더 잘 표현하기 위해 여기 있습니다 이 경우이 문제는로 해결할 수 있습니다..

정확하게 (유일한) 방법입니다.

한 번에 둘 이상의 변수를 표시하는 함수를 작성하고 싶습니다.

하지 않아야합니다. 그러나, (당신이 소유하지 않은 범위로) export ING 변수가 더욱 복잡 import ING (자신의 범위로)보다 듀얼 질문 Is it possible to import variables in JavaScript (node.js)?

에 대한 내 대답에서보세요. 기본적으로 범위는 (global은 제외하고) 전달할 수 있고 동적으로 수정할 수있는 개체가 아니기 때문에 불가능합니다.

당신은 범위를 변경하고자하는 함수의 코드를 수정해야/확장 해결하는 방법. 두 가지 방법을 생각해 볼 수 있습니다.

  • 사용 eval.export() 선언하는 성명을 반환하고 변수 초기화됩니다 마찬가지로

    function export() { 
        var lines = []; 
        for (var p in moduletoexpose) 
         lines.push("var "+p+" = require('moduletoexpose')."+p+";"); 
        return lines.join("\n"); 
    } 
    
    (function() { 
        eval(export(…)); 
        // use `map` here 
    }()) 
    
  • 을, 당신은 폐쇄 소요를 컴파일 해제, 코드에 변수 선언을 추가하는 함수를 작성할 수 있으며,에 Function 생성자를 사용하여 그것으로부터 함수를 생성하십시오. eval 솔루션으로 좋은 소리를하지 않습니다

    exportTo(…, function() { 
        // use `map` here 
        // don't use any free variables but global ones 
    })(); 
    

    처럼 사용할 수 있습니다,하지만 당신은 그런 exportTo을 작성하는 방법에 영감을 this answer을 확인 할 수 있습니다.

+0

내가 찾고있는 것처럼 보입니다. 나는 eval이 피할 수있는 것이라는 말을 들었다. 나는 오염 된 전역 네임 스페이스를 사용하여 한 번만 큰 기능을 생성하기 위해 클로저를 분리하여 달성하려는 노력의 더 나은 예를 시도하고 작성합니다. –

+0

예, 'eval'은 피하는 것이지만, 원하는 것을 성취 할 수있는 유일한 방법입니다. 물론 필자가 제안한 것처럼'export()'하는 것을 피하고 싶을 수도있다 (변수 가져 오기에 관한 링크 참조). – Bergi

관련 문제