这篇文章主要介绍在Vue源码中如何使用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
,用于扩展一个语句的作用域链,但一般情况下不建议使与语用句,因为它可能是引起混淆错误和兼容性问题的根源。在Vue源码中有使与语用句的功能点,因此在这里将简介其功能,以助于阅读框架源码。
性能的利与弊
利
<代码>与代码>语句可以在不造成性能损失的情況下,减少变量的长度。其造成的附加计算量很少。使用& # 39;与# 39;可以减少不必要的指针路径解析运算。但是在大部分情况下,即使不使用,使用临时变量来保存指针或者使用电话,也能达到同样的效果。
弊
<代码>与代码>语句使得程序在查找变量值时,都是先在指定的对象中查找。所以那些本来不是这个对象的属性的变量,查找起来将会很慢。
示例
let obj =, { ,,,,,, ,,,,,, ,,,c: 3 } (obj) { ,,,console.log (a),,,,//1 ,,,console.log (b),,,//2 ,,,console.log (c),,,,//3 }
这段代码中,与关联的obj对象,在与代码块中,每个变量都首选被认为是一个局部变量,如果这个局部变量与obj对象的某个属性同名,则这个局部变量会指向obj对象属性。
function fn (obj) { ,,,,(obj) { ,,,,,,,a =, 1; ,,,} } let obj1 =, { ,,,,2 } let obj2 =, { ,,,b: 3 } fn(其中obj1); console.log (obj1.a),,,,,//1 fn (methoda) console.log (obj2.a),,,,,//定义 console.log (a),,,,,,,,,,//1,变量一个被泄漏到全局作用域链上
上例中,其中obj1存在一个属性,methoda没有一个属性.fn (obj)接收一个obj形参,是一个对象引用,并执行了(obj)。在与代码块的内部,对一个实际上是一个引用,将1赋值给了一个。
当传递methoda给时,与所声明的作用域就是methoda,从这个作用域下开始对一个进行查询.obj2的作用域,fn的作用域和全局作用域中都没有查找到标识符,因此在<强>非严格模式强>下会自动在全局作用域创建一个全局变量,而<强>严格模式强>下则会抛出<代码> ReferenceError> 代码错误。
性能降低
如果在代码中使用了,那么JS引擎在<强>编译阶段强>只能简单地假设关于标识符的判断都将无效,因为编译器也不能知道传递给用的作用域对象到底是谁,因此JS引擎在<强>编译阶段>强进行的性能优化都将无效。最糟糕的情况,那就是如果出现了,所有的优化都将变得无意义。最简单的做法就是不做任何优化,那么运行起来一定会很慢,这将是无法避免的事实。
Vue中与
的Vue在编译的时候,会把模板生成对应的渲染功能,而这个渲染函数中又正好使用了与语句。按照上文来说,不建议使与语用句,为什么在Vue中又会使用到呢?
function render (), { with 才能;(这个),{ ,,,return _c (& # 39; p # 39;, {: {“click":改变}},[_c(& # 39;跨度# 39;[_v(_(数量)))),_v (“,“), _c(& # 39;跨度# 39;,,,,,,(_v(_(名字)))))) ,,} }
因为与的作用域和模板的作用域正好契合,可以极大地简化模板编译过程。而用的代码量很少,把作用域的处理交给JS引擎来做也更可靠。当然,最理想的情况还是要去掉用的使用,预编译的时候会自动把第一遍编译生成的代码进行一次额外处理,用完整的AST分析来处理作用域,把与拿掉,顺便支持ES6语法。换句话说,如果用webpack + vue的时候,最终生成的代码是没的有。
以上是“在vue源码中如何使用,“这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注行业资讯频道!