2014-09-02 2 views
1

간단한 js 엔진이 필요합니다. 그래서 함수를 만들었습니다 :JS 콘텐츠로 평가할 개체를 설정하는 방법은 무엇입니까?

function compile(tpl, scope){ 
    return tpl.replace(/\{\{([\s\S]+?)\}\}/g, function(caught, content){ 
     var compiled; 
     try{ 
     compiled = eval.call(scope, content); 
     }catch(e){ 
     compiled = caught; 
     console.error(e); 
     }finally{ 
     return compiled; 
     } 
    }); 
    } 

좋아, 호출하십시오.

compile('<div>{{ maxSize/1024/1024 }}M</div>', { maxSize: 1048576 }); 

그러나, "정의되지 않은이 maxSize"밖으로 오류 점프.

어떻게 해결할 수 있습니까? 그러나 그것은 안전하지 않습니다,

try { 
    compiled = (new Function('with(this){return ' + content + '}')).call(scope); 
} catch (...) 

이 당신의 접근 방식의 작업을 할 것입니다 : 아마 도움이 될 수 있습니다 무엇

+1

. 'eval'은 그 엔 클로징 스코프를 취할 것입니다. –

+0

도움이 될 것입니다 : http://perfectionkills.com/global-eval-what-are-the-options/ – Sarfraz

답변

2

은 또 다른 악을 건설 with를 사용하고 그런 일을하는 것입니다.

DEMO : 당신은 변수 범위로 객체를 전달할 수 없습니다http://jsfiddle.net/4rujz5b7/

+0

'with'을 사용하는 것이 좋습니다. –

+0

고맙습니다 만 엄격 모드입니다 – phuxuth

+1

@ gordomium : 그래서 뭐라 구요? 컴파일 된 함수가 아닙니다. – Bergi

관련 문제