在js中,eval
和new Function
都有动态解析并且执行js代码的能力,但是两者也是有一些差异的,请看如下代码
<body>
<script>
const a = (b = c = 9)
function aaa() {
const a = 0,
b = 1,
c = 3
return function () {
console.log(a)
}
}
function aaa1() {
const a = 0,
b = 1,
c = 3
return function () {
eval('console.log(a);')
}
}
function aaa2() {
const a = 0,
b = 1,
c = 3
return function () {
new Function('console.log(a);')()
}
}
const fnaaa = aaa()
const fnaaa1 = aaa1()
const fnaaa2 = aaa2()
fnaaa()
fnaaa1()
fnaaa2()
</script>
</body>
第一个和第二个打印出来的是0,第三个打印出来的是9.
看代码去debuge
这里面可以看到new Function是没有打包块级作用域,所以打印出来的是全局作用域下的9