美文网首页
vue的_render函数的with语句为什么不报错

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

作者: 小麻烦爱学习 | 来源:发表于2020-05-07 20:00 被阅读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的执行发生在解释执行阶段,已经不在简单语法分析阶段

    相关文章

      网友评论

          本文标题:vue的_render函数的with语句为什么不报错

          本文链接:https://www.haomeiwen.com/subject/medzghtx.html