如何為js的eval指定一個object作為上下文?

需要實現一個很簡易的js模板.

現在有以下函數:

假設調用compile的時候, tpl和scope 分別如下

運行後發現console中

這是為什麼?


叫你亂抄代碼。


ecmascript 6 就支持string template了,等等吧


看樣子問題已經解決了吧

說點題外話

放棄eval 使用new Function吧

嚴格模式 早已經把eval拒絕在外了。


非常不理解為什麼要用eval,eval速度慢,安全性差(可能被注入代碼),推薦看下Why is using the JavaScript eval function a bad idea?

直接用compiled = scope[caught];就可了,具體代碼如下:

var tpl = "&{{uploadMaxSize}}&";
var scope = {uploadMaxSize: "1M"};
function compile (tpl, scope) {
return tpl.replace(/{{([sS]+?)}}/, function(content, caught) {
var compiled;
compiled = scope[caught];
if (!compiled) return caught;
return compiled;
});
}
compile(tpl, scope);


查了些資料 [Global eval. What are the options?], 發現eval不能夠靠這種方式改變上下文, 於是用了另一種方式:

而且這樣即使在strict mode 也可以用with了


推薦閱讀:

請教變數作用域問題,下面代碼彈出的為什麼不是global?
求解一小段代碼,完全不理解eval的作用機制?
有關JS中作用域的問題,全局作用域中的變數不應該在全局變數對象中嗎,為什麼下面的函數搜索不到全局變數?
為什麼ECMAScript不原生支持重載?
這種所有圖片一直佔據100%寬度的響應式是如何做的?

TAG:前端開發 | JavaScript | eval |