2011-10-13 4 views
2

여러 파일로 분해하려고하는 대규모 함수가 있습니다. 여러 파일에 대해 동일한 함수 종료

var myFunction = function (argument) { 
    var private1, private2, private3; 

    var gadget1 = (function() { 
     // Play around with private1, private2, private3, argument 

     return gadget1API; 
    }()); 

    var gadget2 = (function() { 
     // Play around with private1, private2, private3, argument 

     return gadget2API; 
    }()); 

    var gadget3 = (function() { 
     // Play around with private1, private2, private3, argument 

     return gadget3API; 
    }()); 

    return myFunctionAPI; 
} 

여기 모두가 myFunction 폐쇄 내에 private1, private2, private3에 의존하기 때문에 작동하지 않습니다 여러 파일을 통해 확산 가젯을의 네임 : 여기 내 함수의 구조는 다음과 같다. 이 작업을 수행하려면 3 개의 다른 파일을 닫으려면 myFunction 클로저가 필요합니다.

+0

추가 단계가 필요하지 않으면 C 전처리 기 ('cpp') 및'include' 지시문을 사용하여 JavaScript 파일을 결합 할 수 있습니다. 그것은 '개미'같은 빌드 도구와 함께 케이크 조각입니다. –

답변

1

당신은 객체가 아닌 폐쇄로 만들고, 먼저로드 같은 것을해야합니다

function myObject(argument) { 
    this.arg = argument; 
    this.private1 = whatever; 
    this.private2 = whatever; 
    this.private3 = whatever; 

    this.gadget1 = (function() { 
    // Play around with this.private1, this.private2, this.private3, this.arg 

     return gadget1API; 
    }()); 

    this.gadget2 = (function() { 
    // Play around with this.private1, this.private2, this.private3, this.arg 

     return gadget2API; 
    }()); 

    this.gadget3 = (function() { 
    // Play around with this.private1, this.private2, this.private3, this.arg 

     // return gadget3API; i don't see what this is for, so commented out 
    }()); 

    return myFunctionAPI; 
} 

을 그리고 당신이

var myFunction = new myObject(theargument); 

액세스 할 수있는 정의 된 직후 인스턴스화 이 함수는 다음과 같습니다.

var something1 = myFunction.gadget3(); 
1

대답은 간단합니다. 불가능합니다.

0

완전한 깃털을 가진 매개 변수가있는 것 같습니다. 모듈화 된 시스템. JavaScript/ECMAScript의 장래의 버젼에서는 그러한 개입을하지 않는 편이 낫 습니다만, 개개의 가제트 파일의 명시적인 클로저 환경을 파라미터 화해 클로우즈의 동작을 수동으로 시뮬레이트 한 다음 모든 것을 다시 묶는 것으로 충분합니다 (즉, 가젯을 링크) 가제트를 인스턴스화하여.

gadget1.js :

var gadget1 = function (env) { 
    with (env) { 
    // Play around with private1, private2, private3, argument 

    return gadget1API; 
    } 
} 

gadget2.js :

var gadget2 = function (env) { 
    with (env) { 
    // Play around with private1, private2, private3, argument 

    return gadget2API; 
    } 
} 

main.js는 :

var myFunction = function (argument) { 
    var private1, private2, private3; 
    var gadgetFns = [gadget1, gadget2, …]; 
    var gadgets = []; 
    function closureEnvF() { this.argument=argument, this.private1=private1, this.private2=private2, this.private3=private3 }; 
    var closureEnv = new closureEnvF(); 
    for (var i = 0; i<gadgets.length; i++) { 
    gadgets[i] = gadgetFns[i].apply(null, closureEnv); 
    } 
    return myFunctionAPI; 
} 

이 아마이든 모든 요소에 따라 단순화 할 수있다 클로저 환경은 시작점이되는 객체입니다. 이것은 상당히 일시적인 해결책이지만 클로저가 마술이 아니라는 점을 설명합니다 (단순한 함수와 함축적으로 통과 된 클로저 환경).

관련 문제