2014-02-08 2 views
1

기능을 재 할당하는 데 문제가 있습니다. 이전에 정의한 함수 drawScene을 다른 방법으로 지정하려고합니다.eval을 사용한 자바 스크립트 기능 할당

function fSwap(funcName, code) { 
    eval(funcName) = eval(code); 
} 
fSwap("drawScene", "function drawScene() { /* Do something */ }"); 

나는이 일을해야 같은 느낌,하지만 어떤 이유로 eval(funcName)에 대한 좌변이 아니며 오류 ReferenceError: invalid assignment left-hand side를 반환합니다. 모든 당혹는 다음과 같습니다

var a = function test() {return 0;}; 
alert(a === eval("a")); 
eval("a") = function test() {return 1;}; 

true와 경고를 제공하지만, 나를 기능 a에 할당하지 않습니다.

내 생각에 eval()은 보안 상 이유로 lvalues를 반환하지 않습니다. 그렇다면 어떻게 fSwap()을 구현하여 두 개의 문자열을 가져 와서 주어진 함수 이름에 코드를 할당 할 수 있습니까?

+0

왜 {뭔가 * /를 수행/*}'drawScene =() 함수를 사용하지, '전혀 평가하지 않고도? – Vitruvius

+0

사용자가 입력 한 문자열을 함수에 할당하려고합니다. – JDong

답변

6

대신 콜백 기능을 사용해야합니다. 이 같은이 작업을 수행 할 수 있습니다

function fSwap(funcName, callback) { 
    window[funcName] = callback; 
} 
fSwap("drawScene", function drawScene() { /* Do something */ }); 

은 귀하의 질문에 대답하기 위해 직접 잘못 무슨 일이 일어나고 있는지 당신이 코드의 평가 부분에 값을 할당하고 있다는 점이다. 그것은 작동하지 않습니다. 무엇이 작동할까요 :

function fSwap(funcName, code) { 
    eval(funcName+' = '+code); 
} 

그러나 이렇게하지 마십시오. 콜백 함수를 사용하는 다른 방법은 훨씬 깔끔합니다. eval을 절대 사용하지 않을 때는 항상 사용하지 않는 것이 좋습니다. (your comment에 따르면, 분명히 문자열을 사용하는 것이 절대적으로 필요하므로이 코드를 사용하십시오.)

+0

fSwap의 두 인수는 모두 문자열입니다. 첫 번째 코드 조각은 여전히 ​​작동합니까? – JDong

+1

@JDong 두 번째 코드 블록 ('eval'을 사용하는 코드 블록)은 실제로 입력 된 두 개의 문자열로 작동합니다. 첫 번째 코드는 두 번째 매개 변수가 함수가되어야합니다. 두 매개 변수가 모두 문자열이어야하는 경우 두 번째 코드를 사용하십시오. 그게 효과가있다. – Joeytje50

+0

불행히도 eval()을 사용해야합니다. 사용자 입력 기능을 사용하여 코드에 할당하는 더 좋은 방법이 있다면, 나는 여전히 모든 귀입니다. – JDong

0

나는 파티에 늦었지만 사용자 입력 문자열을 함수로 사용하려면 다음을 수행해야합니다.

var foo=function(){alert("foo");}; 
foo();//alerts 'foo' 

function fSwap(funcName, fn) { 
    eval("newfunc = "+fn); 
    window[funcName] = newfunc; 
} 
fSwap("foo","function(){alert('bar');}"); 

foo();//alerts 'bar' 

DEMO : jsbin

+0

'window [funcName] = newfunc;은 필요한가요? 나는'eval (funcName + '='+ code);와 같은 느낌이 들지만 임시 변수를 생성하지 않기 때문에 아마 더 좋은 해결책 일 것입니다. – JDong

+0

@JDong 네, 맞아요. 필자의 머리에서는'window [funcName]'을 사용하면 이미 존재하는 함수를 바꾸는 것만을 제한 할 수 있다고 생각했다. 확인한 후, 나는 그것이 bollocks 이었다는 것을 깨닫는다;) – Moob