2012-04-07 2 views
1

작은 프레임 워크를 개선하고 싶습니다. 따라서 eval에 대한 두 번의 호출을 제거하고 싶습니다. 자바 스크립트 변수를 동적으로 지정합니다. [eval() 제거하기]

는 코드가 말하는 보자

# irf.coffee (The Framework) 
# Classes which are appended to the namespace 'IRF' 
classes = [ 
    "Background" 
    "BoundingBox" 
    # ... 
] 

# Namespace where to attach classes 
@IRF = {} 

# TODO: Get rid of eval(c) 
for c in classes 
    @IRF[c] = eval(c) 

난 단지 '을 오염'내가 new IRF.Background() 같은 클래스/객체에 액세스 할 수있는 글로벌 네임 스페이스에 IRF를 원한다.

이 프레임 워크의 목표는이 프레임 워크를 포함한 다른 프로젝트에서 사용됩니다. 그래서 이런 프로젝트가있을 수 있습니다 :

class TowerMap extends IRF.Game 
    constructor: (width, height) -> 
    @background = new IRF.Background(width, height) 

보시다시피, 나는 여기에 IRF 네임 스페이스를 사용해야하지만이 그랬던 것처럼이 특정 프로젝트 내에서 나는, 네임 스페이스없이 사용하고 싶습니다 :

# Require all Class of IRF, so we won't need namespace here 
# TODO: get rid of eval 
eval("var #{k} = v") for k,v of IRF 

class TowerMap extends Game 
    constructor: (width, height) -> 
    @background = new Background(width, height) 

모든 것이 예상대로 작동하지만, 어떻게 든 두 eval의 나를 방해. 다른 해결책이있을 수 있습니까?

답변

1

필요한 비트를 가져 오지 않는 이유는 무엇입니까?

Background = IRF.Background 

class TowerMap extends Game 
    constructor: (width, height) -> 
    @background = new Background(width, height) 

당신은 eval ECMA 스크립트 5 엄격 모드 그렇게 eval('var x = ...') 엄격 모드에서 비 평가 코드를 주변에 볼 수있는 변수를하지 않습니다 새로운 변수 선언을 소개 할 수 있음을 알고 있어야합니다.

EcmaScript 5 Appendix C

엄격한 모드 eval 코드 eval에 발신자의 변수 환경 변수 나 함수를 인스턴스화 할 수 없습니다 말했다. 대신 새로운 변수 환경이 만들어지고이 환경은 eval 코드 (10.4.2)에 대한 선언 바인딩 인스턴스화에 사용됩니다.

+0

첫 번째 아이디어는 'IRF.requireClasses()'와 같은 프레임 워크를 쉽게 요구할 수있게하는 것이 었습니다. 하지만 제대로 작동하지 못했기 때문에 hacky 구현으로 평가했습니다. 하지만 모든 것이 아니라 실제로 사용하는 비트를 요구하는 것이 가장 좋습니다. – Deradon

1

현재 컨텍스트에서 로컬 변수에 액세스 할 수있는 방법은 없습니다 (적어도 ecmascript에서는 아마도 비표준 확장자가있을 수 있습니다).

일부 개체의 속성에만 액세스 할 수 있습니다. 전역 변수는 전역 객체의 속성이기 때문에 액세스 할 수 있습니다. 이는 브라우저에서 window이고 ecma-3에서는 (function(){ return this })()으로 얻을 수 있습니다.

관련 문제