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运行的三个阶段:
- 简单语法分析阶段:这个阶段还没分析new Function里面的语法,所以fn里面的with不会报错;而fn1里面的with报语法错误
- 预编译阶段
- 解释执行阶段:new Function的执行发生在解释执行阶段,已经不在简单语法分析阶段
网友评论