2012-05-10 1 views
4

우리는 많은 파일들로 분할 된 js 코드를 가지고 있습니다. 우리는 다른 많은 js 파일에서 사용되는 코드를 정의하는 핵심 파일을 가지고 있습니다.eval을 사용하지 않고 멤버 함수를 사용하는 것과 같은 방법으로 문자열을 사용하여 클로저를 참조 할 수 있습니까?

core.js :

window.mycore = function() { 

    var myfunction1 = function() { 
    }; 
    var myfunction2 = function() { 
    }; 
    var myfunction3 = function() { 
     //.. 
     var a = myfunction1(b); 
     //..   
    }; 
    //... 
    // many "myfunction" 
    //... 
    var myfunctionN = function() { 
    }; 
    var publish = function() { 
     for(var i = 0; i < arguments.length; i++) { 
      try { 
       window.mycore[arguments[i]] = eval('(' + arguments[i] + ')'); 
      } 
      catch(e) { 
       Log.err(600, arguments[i], e); 
      } 
     } 
    }; 
    publish("myfunction1", "myfunction7", "myfunction8",/*...*/"myfunctionM") 
} 

app.js : 없음 핵심 방법은 윈도우의 멤버로서 선언 된 것을

// ... 
// ... 
var result = window.core.myfunction1("myparam"); 
// ... 
// ... 

현재 우리는 다음과 같이 있습니다. 핵심 개체. 대신 게시 기능을 사용하여 핵심 개체에 연결됩니다.

은 몇 가지 장점이 있습니다. "window.core"핵심 코드 작성의 필요없이 핵심 기능을 참조 할 수 있습니다

  • 모든 공용 함수 선언에 "var myfunction = window.mycore.myfunction = function() ..."을 쓰지 마십시오.
  • 노출 된 메서드는 중앙 집중식으로 볼 수 있습니다.

그러나 eval 선언을 이해하지 못하기 때문에 게시 기능에서 eval을 사용하면 코드 분석 도구를 사용할 때 문제가 발생합니다.

여기 내 질문이 있습니다. 이 코드를 개선하는 더 좋은 방법은 무엇입니까, 그래서 우리는 언급 된 장점을 유지하면서 평가 선언을 근절 할 수 있습니다. publish ({ 'myfunction1': myfunction1}, ...) 같은 일부 이름/값 쌍을 게시 함수에 보내는 해결책을 알고 있지만 함수 이름 반복을 피하기를 원합니다. 이미 많은 코드가 작성되었으므로 급진적 인 변화를 기대하지 않는다고 생각하십시오.

감사합니다.

답변

2

"게시"메서드를 사용하는 이유를 완전히 이해하고 있는지 모르겠지만 생성자에서 올바른 함수를 사용하여 개체를 반환하지 않는 이유가 무엇입니까?

예 :

window.mycore = (function() { 
    var myFunc1 = function(a) { 
     alert(a); 
    }; 

    var myFunc2 = function(b) { 
     // call to other function in the same scope 
     myFunc1(b); 
    } 

    ... 

    // at the end just expose the public members you want 
    return { 
     myFunc1: myFunc1, 
     myFunc2: myFunc2 
    }; 
})(); 

또는

window.mycore = (function() { 
    return { 
     myFunc1: function(a) { 
     alert(a); 
     }, 
     myFunc2: function(b) { 
     this.myFunc1(b); 
     } 
    }; 
})(); 

이나, 아직 ... 항상

를 얻을 수있는 다른 방법이 있기 때문에 같은 객체 :)으로 끝낼 수있는 또 다른 방법
(function(){ 

    var o = {}; 

    o.func1 = function(a) { 
     alert(a); 
    } 

    o.func2 = function(b) { 
     this.func1(b); 
    } 

    window.mycore = o; 

})(); 
+0

myFunc1에서 발생하는 것처럼 함수 이름을 반복하지 않도록하고 싶습니다. myFunc1. 많은 기능이 있다고 생각하십시오. – gztomas

+0

내 편집을 참조하십시오. 당신은 그렇게 할 수 있습니다. 어쨌든 함수 이름을 실제로 반복하는 것 외에도 한 번 선언을하고 게시 함수를 호출하면 안됩니까? – Jaime

+0

그것은 myFunc2에서 myFunc1을 참조하고 싶을 때마다 window.mycore.myFunc1을 작성해야만합니다. – gztomas

0

그래서 근본적인 수준에서, 나는 당신이 그 이름 공간을 객체로 작성하는 것이 유익했을 것이라고 생각합니다. 그러나 완전히 다른 주제입니다. (그리고 그것은 당신이 많은 리팩토링을하고 싶지 않다는 사실에 근거하여 실격 처리합니다). 말했다와

은 내 첫 번째 아이디어는 아마.call() 또는 .apply() 방법을 사용하여 평가의 필요성을 회피 수 있었다. 함수 이름에서 함수 호출을 연결하는 것입니다. 그러나 그것은 당신이 당신의 출판 기능을 제공하고있는 "문자열"에는 적용되지 않습니다.

var fn = window[settings.functionName]; 
if(typeof fn === 'function') { 
    fn(t.parentNode.id); 
} 
개인적으로

https://stackoverflow.com/a/912642/680578

0

내가 @Jaime 접근 방식을 선호하지만, 어쩌면 당신이

window.mycore = function() { 

    function myfunction1() { 
    }; 
    function myfunction2() { 
    }; 
    function myfunction3() { 
     //.. 
     var a = myfunction1(b); 
     //..   
    }; 
    //... 
    // many "myfunction" 
    //... 
    function myfunctionN() { 
    }; 
    var publish = function() { 
     for(var i = 0; i < arguments.length; i++) { 
      try { 
      window.mycore[arguments[i].name] = arguments[i]; 
      } 
      catch(e) { 
      Log.err(600, arguments[i].name, e); 
      } 
     } 
    }; 
    publish(myfunction1, myfunction7, myfunction8,/*...*/myfunctionM); 
} 
같은 일을 할 수

그래서 인터넷 검색 후, 이것은 당신이 문자열에서 기능을 실행하는 방법입니다

+0

이름 속성은 크로스 브라우저입니까? – gztomas

+0

나는 그렇게 생각하지만 그것에 대해 확신하지 못한다. 이전 버전의 IE에서 기대하는 바가 있습니다. – abidibo

관련 문제