如何為js的eval指定一個object作為上下文?
01-21
需要實現一個很簡易的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 |