深入浅析With的使用

深入浅析With的使用

with用于扩展一个语句的作用域链,但一般情况下不建议使用with语句,因为它可能是引起混淆错误和兼容性问题的根源。在Vue源码中有使用with语句的功能点,因此在这里将简介其功能,以助于阅读框架源码。

性能的利与弊

with语句可以在不造成性能损失的情況下,减少变量的长度。其造成的附加计算量很少。使用’with’可以减少不必要的指针路径解析运算。但是在大部分情况下,即使不使用with,使用临时变量来保存指针或者使用call,也能达到同样的效果。

with语句使得程序在查找变量值时,都是先在指定的对象中查找。所以那些本来不是这个对象的属性的变量,查找起来将会很慢。

示例

let obj = {    a: 1,    b: 2,    c: 3}with(obj){    console.log(a)    //1    console.log(b)    //2    console.log(c)    //3}

登录后复制

这段代码中,with关联的obj对象,在with代码块中,每个变量都首选被认为是一个局部变量,如果这个局部变量与obj对象的某个属性同名,则这个局部变量会指向obj对象属性。

function fn(obj){    with(obj){        a = 1;    }}let obj1 = {    a: 2}let obj2 = {    b: 3}fn(obj1);console.log(obj1.a)     //1fn(obj2)console.log(obj2.a)     //undefinedconsole.log(a)          //1,变量a被泄漏到全局作用域链上

登录后复制

上例中,obj1存在a属性,obj2没有a属性。fn(obj)接收一个obj形参,是一个对象引用,并执行了with(obj)。在with代码块的内部,对a实际上是一个引用,将1赋值给了a。

当传递obj2给with时,with所声明的作用域就是obj2,从这个作用域下开始对a进行查询。obj2的作用域、fn的作用域和全局作用域中都没有查找到标识符a,因此在非严格模式下会自动在全局作用域创建一个全局变量,而严格模式下则会抛出ReferenceError错误。

性能降低

如果在代码中使用了with,那么JS引擎在编译阶段只能简单地假设关于标识符的判断都将无效,因为编译器也不能知道传递给with的作用域对象到底是谁。因此JS引擎在编译阶段进行的性能优化都将无效。最糟糕的情况,那就是如果出现了with,所有的优化都将变得无意义。最简单的做法就是不做任何优化,那么运行起来一定会很慢,这将是无法避免的事实。

Vue中的with

Vue 在 compile 的时候,会把 template 生成对应的 render function,而这个 render function中又正好使用了with语句。按照上文来说,不建议使用with语句,为什么在Vue中又会使用到呢?

相关推荐:《vue.js教程》

function render () {  with (this) {    return _c('p',{on:{"click":change}},[_c('span',[_v(_s(number))]),_v(" "),_c('span',     [_v(_s(name))])])  }}

登录后复制

因为with 的作用域和模板的作用域正好契合,可以极大地简化模板编译过程。而with的代码量很少,把作用域的处理交给JS引擎来做也更可靠。当然,最理想的情况还是要去掉with的使用,预编译的时候会自动把第一遍编译生成的代码进行一次额外处理,用完整的AST分析来处理作用域,把with拿掉,顺便支持ES6语法。换句话说,如果用 webpack + vue 的时候,最终生成的代码是没有 with 的。

相关推荐:2020年前端vue面试题大汇总(附答案)vue教程推荐:2020最新的5个vue.js视频教程精选

更多编程相关知识,请访问:vue.js教程!!

以上就是深入浅析With的使用的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/3023097.html

(0)
上一篇 2025年3月13日 06:03:00
下一篇 2025年3月11日 17:58:43

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 浅谈Vue.use到底是什么?

    Vue.use到底是什么鬼、下面本篇文章就来给大家介绍一下Vue.use。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 我们在使用Vue做项目开发的时候,看到不少轮子都是通过Vue.use来进行使用,感觉甚是高大上。 不…

    2025年3月13日
    200
  • 浅谈Vue.js中双向绑定的原理及实现方法

    Vue最独特的特性之一,是其非侵入性的响应式系统。数据模型仅仅是普通的JavaScript对象。而当你修改它们时,视图会进行更新。vue通过双向绑定实现,本文就来为大家介绍一下vue双向绑定原理及实现方法。 本文主要介绍两大内容: 1. v…

    2025年3月13日 编程技术
    200
  • 详解vue.js中如何处理事件

    下面vue.js教程给大家介绍一下使用vue.js处理事件的方法,希望对大家有一定的帮助。 当您使用Vue构建动态网站时,您很可能希望它能够响应事件。 例如,如果用户单击按钮,提交表单,甚至只是移动鼠标,您可能希望您的Vue网站以某种方式做…

    2025年3月13日
    200
  • 实现带有进度条的Vue延迟加载

    下面vue.js栏目给大家介绍一下给vue的惰性加载添加进度条的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 简介 通常用 Vue.js 编写单页应用(SPA)时,当加载页面时,所有必需的资源(如 JavaScri…

    2025年3月13日
    200
  • 浅谈vue-cli初始化Vue项目的项目结构

    概述 vue-cli是vue 提供的一个官方命令行工具,可用于快速搭建大型单页应用。该工具提供开箱即用的构建工具配置,带来现代化的前端开发流程。只需几分钟即可创建并启动一个带热重载、保存时静态检查以及可用于生产环境的构建配置的项目。 使用v…

    2025年3月13日 编程技术
    200
  • 分析一下Vue.use的源码

    有过vue开发经验的,对于vue.use并不陌生。当使用vue-resource或vue-router等全局组件时,必须通过Vue.use方法引入,才起作用。那么vue.use在组件引入之前到底做了那些事情呢? 先上vue.use源码 Vu…

    2025年3月13日
    200
  • vue.js中如何使用v-for以及怎么获取索引?

    下面vue.js教程栏目带大家了解一下vue.js中v-for的使用及索引获取。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 登录后复制   变化如下: el处需id,写body报错;参数index需写在item后面;作…

    2025年3月13日
    200
  • 了解vue.js中的常用指令(总结)

    v-text v-text主要用来更新textContent,可以等同于JS的text属性。 // 等同于下方语句: {{text}} 登录后复制 v-html 双大括号的方式会将数据解释为纯文本,而非HTML。为了输出真正的HTML,可以…

    2025年3月13日
    200
  • vue.js图片怎么渲染

    vue.js渲染图片的方法:首先初始化列表;然后获取上个页面带过来的参数,获取api,app,foot;接着向后传递参数;最后渲染本地图片。 【相关文章推荐:vue.js】 vue.js渲染图片的方法: 带参数传值 本地美食 立即学习“前端…

    2025年3月13日
    200
  • vue.js打包后图片路径错误怎么办

    vue.js打包后图片路径错误的解决办法:1、修改【assetsPublicPath: ‘./’】;2、打开【webpack.prod.conf.js】,在output增加【publicPath: ‘./…

    2025年3月13日 编程技术
    200

发表回复

登录后才能评论