은 아마 당신이 뭘하려는 건지에 대한 더 나은 만능 해결 방법이 있습니다 당신이 통제 할 수없는이 코드의 일부 또는 전부를이 있다면
// object to store callbacks on
var callbacks = {};
// define your callback
callbacks['savecallback'] = function() {
alert('testing savecallback');
}
// save your callback name
var stringname = 'savecallback';
jQuery(".divclass").click(function() {
// call your callback by name
callbacks[stringname]();
});
: 게시했습니다, 나는 당신의 기능을위한 객체 속성을 사용하고 대신 전체 기능 실행 문자열의 객체 속성의 이름을 저장하는 생각 하는데요 (콜백 정의 또는 저장된 문자열) 우리에게 알려주십시오 - 주위에도 방법이 있습니다. 콜백이 윈도우 범위에 정의되어 있다면 window[stringname]();
을 사용할 수 있고 콜백 문자열을 변경할 수 없다면 stringname = stringname.replace('()','');
을 사용할 수 있습니다. 어쨌든, 실제로 eval
대신에 실행할 함수를 식별하기 위해 문자열을 사용할 수 있다면 그 것이 가장 좋을 것입니다.
편집 : 전체 기능 구현이 문자열 인 경우 거의 eval
입니다. 스크립트 태그 내의 DOM에 문자열을 삽입 할 수는 있지만, 테스트 (테스트되지 않은 경우)하는 것만으로도 eval보다 위험 할 수 있습니다. 거의 모든 시간에 문자열 형식으로 실행하려는 코드가 있으면 그 문자열에서 이전 내용을 실행할 위험이 있습니다. 만큼 당신이 위험을 알고있는 한, 평가는 세상의 끝이 아니다 -로 유지하려고 가능한, 예를 들어 같은 폐쇄 :
function getEvalClosure(evalCode) {
return function() { return eval(evalCode); }
}
jQuery(".divclass").click(function() {
var f = (getEvalClosure(stringname))();
// i noticed your code is itself a function,
// so you'd have to run it after eval-ing it into existence
f();
});
이제까지 '안전'하지 않습니다 ,하지만 최종 사용자가 귀하의 자바 스크립트의 어쨌든 어떤 부분과 원숭이를 기억, 그래서 내가 처음부터 클라이언트 자바 스크립트에서 너무 민감한 아무것도 수행하지 않는 것이 좋습니다. 이 경우 'getEvalClosure'함수는 eval이 작동하는 새로운 범위를 작성하여 나머지 코드와 한 단계 더 멀리 유지합니다. 필자는 AJAX 요청에서 문자열 화 된 JSON을 모든 라이브러리가 자동으로 처리하기 전에 eval을 사용하여 광범위하게 사용했습니다. 사실 구현에 있어도 eval() 또는 2가 여전히 존재할 것입니다.
행운을 빈다!