当前位置: 首页 > Web前端 > vue.js

With的用法

时间:2023-03-31 19:31:49 vue.js

with用于扩展一个语句的作用域链,但一般不推荐使用with语句,因为它可能是混淆错误和兼容性问题的根源。在Vue源码中有使用with语句的功能点,这里简单介绍一下它的作用,以帮助阅读框架源码。性能优缺点with语句可以减少变量的长度而不会导致性能下降。它引起的额外计算量非常小。使用'with'可以减少不必要的指针路径解析操作。但大多数情况下,即使不使用with,使用临时变量保存指针或者使用call,也能达到同样的效果。with语句使程序在查找变量值时首先在指定的对象中查找。所以那些不是这个对象的属性的变量,查找起来会很慢。示例letobj={a:1,b:2,c:3}with(obj){console.log(a)//1console.log(b)//2console.log(c)//3}在这段代码中,与with关联的obj对象,在with代码块中,每个变量首先被认为是一个局部变量,如果这个局部变量与obj对象的一个??属性同名,那么这个局部变量将指向obj对象的属性。函数fn(obj){with(obj){a=1;}}letobj1={a:2}letobj2={b:3}fn(obj1);console.log(obj1.a)//1fn(obj2)console.log(obj2.a)//undefinedconsole.log(a)//1、变量a泄漏到全局作用域链上面的例子中obj1有属性,obj2没有a属性。fn(obj)接收一个obj参数,是一个对象引用,执行with(obj)。在with代码块内部,a其实是一个引用,1赋值给了a。当把obj2传给with时,with声明的作用域就是obj2,从这个作用域开始查询。在obj2的作用域,fn的作用域,全局作用域都没有找到标识符a,所以在非严格模式下会在全局作用域自动创建一个全局变量,在严格模式下会抛出ReferenceError错误.性能降低如果在代码中使用了with,JS引擎在编译阶段只能简单的假定关于标识符的判断是无效的,因为编译器不知道传递给with的作用域对象是谁。因此,JS引擎在编译阶段进行的性能优化是无效的。最坏的情况下,如果with出现,所有的优化都将变得毫无意义。最简单的办法就是不做任何优化,那么运行起来会很慢,这是无法回避的事实。Vue中的WithVue在编译时会从模板中生成对应的render函数,而with语句恰好用在了这个render函数中。上面说的不推荐使用with语句,为什么在Vue中要用呢?functionrender(){with(this){return_c('div',{on:{"click":change}},[_c('span',[_v(_s(number))]),_v(""),_c('span',[_v(_s(name))])])}}由于with的作用域与模板的作用域匹配,因此可以大大简化模板的编译过程。withwith的代码量非常少,将scope的处理交给JS引擎更靠谱。当然最理想的情况是去掉with的使用。预编译时,第一次编译生成的代码会自动进行追加处理,使用完整的AST解析来处理作用域。with去掉了,顺便支持ES6。语法。也就是说,如果你使用webpack+vue,最终生成的代码是不会有with的。