2012-04-03 7 views
0

이 함수에서 eval 문을 제거하려고합니다. 나는이 [뭐든간에] 스타일 대체에 익숙하지만이 경우에는 효과가 없습니다. 가 찾아 보게한다 : 함수에서개인 범위 변수에서 eval을 바꿉니다

var App = (function(fw) { 
    var somevar1 = "hello"; 
    var somevar2 = "world"; 
    this.get = function(what) { 
     return eval(what); 
    } 
}); 

var app = new App({some: "thing"}); 

// now for the use: 
console.log(app.get("somevar1"),app);​ 

을, 옵션은 예를 들어 작동하지 않습니다 내 모든 정상 "세정 평가는"내가 사용하지 못할 :

return this[what] 
return [what] 
return app[what] 
return new Function(what); 

를 확실하게이 이상한 경우 곳이 아니다 평가가 필요합니까? ps는 거대한 코드베이스의 일부이므로 앱 내부의 변수를 다시 조사 할 수 없다는 점에 유의해야합니다.

여기에 바이올린 뭔가 :

불행하게도 http://jsfiddle.net/xAVYa/

답변

6

, 당신은 운이있어; eval이며,과 같은 변수에 액세스 할 수있는 유일한 것입니다.

var App = (function(fw) { 
    var data = { 
     somevar1: "hello", 
     somevar2: "world" 
    }; 

    this.get = function(what) { 
     return data[what]; 
    }; 
}); 

을 그리고 단지 점차적으로 당신이 그것을 볼 전체 코드베이스를 통해이 작업을 수행 : 다음 번에, 당신은 data 객체를 유지하여 마이그레이션을 시작할 수 있습니다 방법 :

일을하지 않습니다. 아무것도 망가 뜨리지 않아야합니다.

+0

lol ..... 슬픈 듯이 슬픈 듯이 프로젝트를 확장하고 있습니다.) – Alex

3

eval없이 문자열 이름을 사용하여 임의의 로컬 변수에 액세스 할 수 없습니다. 따라서, 변수가 app 함수 안에있는 다른 코드에 의해 어떻게 액세스되는지를 바꿀 의향이 없다면, eval (마치보기 흉한 것처럼)을 고수해야 할 것입니다.

somevar1somevar2에 액세스하는 app() 함수 내부의 코드를 변경하려는 경우 옵션이 있습니다. .get() 함수에 대해 동일한 계약을 유지할 수 있기 때문에 app() 함수 외부의 값을 변경할 필요가 없습니다. 따라서이 변수에 액세스 할 수있는 프로젝트의 모든 곳을 찾기가 쉽지 않습니다. . 현재 선언 된 방식으로 인해 app() 함수 내부에서 직접 액세스 할 수 있으므로 검색/바꾸기가 해당 범위로 제한됩니다. 변수는 개체의 속성을 수하는 것이 OK라면

, 당신이 할 수 있습니다 : 평가하지 않고이 작업을 수행 할 수있는 동적 인 방법이 없습니다

var app = function(fw) { 
    this.somevar1 = "hello"; 
    this.somevar2 = "world"; 
    this.get = function(what) { 
     return this[what]; 
    } 
}; 

var app = new App({some: "thing"}); 

// now for the use: 
console.log(app.get("somevar1"));​ 
console.log(app.somevar1); 
console.log(app["somevar1"]); 
+0

질문 : "거대한 코드베이스의 일부로 앱 내부 변수를 다시 조사 할 수 없습니다" – icktoofay

+3

@icktoofay - "앱 내부 변수를 다시 조사 할 수 없다"는 것이 정확히 무엇을 의미합니까? 단단한. 앱 객체 정의 안의 코드 만이'somevar1'과'somevar2'에 접근 할 수 있었기 때문에 (그 범위에서 사적인 것처럼), 그 객체 정의 내에서 한 번의 간단한 검색과 대체가 참조로 속성을 변경하여 속성으로 액세스 할 수 있습니다. 이는 멀리있는 코드에 영향을 줄 수있는 변경 유형이 아닙니다. – jfriend00

+0

옙 ... eval이 실제로 내 친구 인 드문 경우를 발견했습니다 ...Rescoping은 모듈을 다룰 때마다 app.get 함수를 사용하고 app.set app.add 등을 사용하여이 스레드를 닫으려는 2 일의 확고한 작업이 필요합니다. – Alex

0

. 변수가 변경되지 않는다면 다음과 같이 시도 할 수 있습니다.

var App = (function(fw) { 
    var somevar1 = "hello"; 
    var somevar2 = "world"; 
    this.get = function(what) { 
     switch (what) { 
     case "somevar1": 
      return somevar1; 
     case "somevar2": 
      return somevar2; 
     } 
    } 
}); 
관련 문제