vue的_render函数的with语句为什么不报错

2020-05-07  本文已影响0人  小麻烦爱学习

vue是运行在严格模式的,而严格模式中是禁止使用with语句的.为什么_render函数包含with语句而不会报错呢?
因为_render函数是通过new Function()实例化的一个函数:

function createFunction (code, errors) {
      try {
        return new Function(code)
      } catch (err) {
        errors.push({ err: err, code: code });
        return noop
      }
    }

MDN网站的描述:
由 Function 构造器创建的函数不会创建当前环境的闭包,它们总是被创建于全局环境,因此在运行时它们只能访问全局变量和自己的局部变量,不能访问它们被 Function 构造器创建时所在的作用域的变量
还是没有解释为啥Function里面的with不报错

<script>
    "use strict";
    let fn = new Function('with(this){console.log(this)}');
    fn.call(null);//没有报错,打印出window
    let fn1 = function() {with(this){console.log(this)}}
    fn1.call(null);//Uncaught SyntaxError: Strict mode code may not include a with statement
</script>

js运行的三个阶段:

  1. 简单语法分析阶段:这个阶段还没分析new Function里面的语法,所以fn里面的with不会报错;而fn1里面的with报语法错误
  2. 预编译阶段
  3. 解释执行阶段:new Function的执行发生在解释执行阶段,已经不在简单语法分析阶段
上一篇下一篇

猜你喜欢

热点阅读