在js中,evalnew 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
1646551633579.jpg
这里面可以看到new Function是没有打包块级作用域,所以打印出来的是全局作用域下的9

Last modification:March 6, 2022
If you think my article is useful to you, please feel free to appreciate