- 1、eval中的代码执行时的作用域为当前作用域。它可以访问到函数中的局部变量。
*2、new Function中的代码执行时的作用域为全局作用域,不论它的在哪个地方调用的。所以它根本无法访问函数内的局部变量。
new Function
- 使用
let fn = new Function('a', 'b', 'return a + b')
fn()
// 前面都是参数,后面是函数体
- 构建模版语法
// 实现一个js模版引擎
// with 作用域 with(obj) {访问obj内的变量}\
// new Function () {} 返回一个函数
let str = `
<%if(user){%>
hello <%=user.name%>
<%}else{%>
hello world
<%}%>
<ul>
<%for(let i = 0; i < total; i++) {%>
<li><%=i%></li>
<%}%>
</ul>
`
let options = {user: {name: 'xxx'}, total: 5}
function render (str, options) {
let head = 'let tpl = ``; \n with(obj) { \n tpl += `'
str = str.replace(/<%=([\s\S]+?)%>/g, function() {
return '${' + arguments[1] + '}'
})
str = str.replace(/<%([\s\S]+?)%>/g, function() {
return '` \n' + arguments[1] + 'tpl+=`'
})
let tail = "`} \n return tpl;"
let html = head + str + tail;
let fn = new Function('obj', html)
return fn(options);
// console.log(fn(options));
}
render(str, options)
网友评论