0

0

深入浅析With的使用

青灯夜游

青灯夜游

发布时间:2020-10-23 17:45:58

|

2942人浏览过

|

来源于segmentfault

转载

深入浅析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)     //1

fn(obj2)
console.log(obj2.a)     //undefined
console.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错误。

宠物商店
宠物商店

目前,PetShop已经从最初的2.0、3.0等版本,发展到了最新的4.0版本。PetShop 4.0使用ASP.NET 2.0技术开发,其中加入了众多新增特性,因此,在性能、代码数量、可扩展性等方面有了重大改善。可以说,学习PetShop 4.0是深入掌握ASP.NET 2.0技术的捷径。本节将引领读者逐步了解PetShop 4.0的方方面面,包括应用程序安装、功能和用户界面简介、解决方案和体系

下载

性能降低

如果在代码中使用了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视频教程精选

更多编程相关知识,请访问:编程入门!!

相关专题

更多
苹果官网入口直接访问
苹果官网入口直接访问

苹果官网直接访问入口是https://www.apple.com/cn/,该页面具备0.8秒首屏渲染、HTTP/3与Brotli加速、WebP+AVIF双格式图片、免登录浏览全参数等特性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

115

2025.12.24

拼豆图纸在线生成器
拼豆图纸在线生成器

拼豆图纸生成器有PixelBeads在线版、BeadGen和“豆图快转”;推荐通过pixelbeads.online或搜索“beadgen free online”直达官网,避开需注册的诱导页面。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

82

2025.12.24

俄罗斯搜索引擎yandex官方入口地址(最新版)
俄罗斯搜索引擎yandex官方入口地址(最新版)

Yandex官方入口网址是https://yandex.com。用户可通过网页端直连或移动端浏览器直接访问,无需登录即可使用搜索、图片、新闻、地图等全部基础功能,并支持多语种检索与静态资源精准筛选。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

546

2025.12.24

JavaScript ES6新特性
JavaScript ES6新特性

ES6是JavaScript的根本性升级,引入let/const实现块级作用域、箭头函数解决this绑定问题、解构赋值与模板字符串简化数据处理、对象简写与模块化提升代码可读性与组织性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

150

2025.12.24

php框架基础知识汇总
php框架基础知识汇总

php框架是构建web应用程序的架构,提供工具和功能,以简化开发过程。选择合适的框架取决于项目需求和技能水平。实战案例展示了使用laravel构建博客的步骤,包括安装、创建模型、定义路由、编写控制器和呈现视图。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

20

2025.12.24

Word 字间距调整方法汇总
Word 字间距调整方法汇总

本专题整合了Word字间距调整方法,阅读下面的文章了解更详细操作。

47

2025.12.24

任务管理器教程
任务管理器教程

本专题整合了任务管理器相关教程,阅读下面的文章了解更多详细操作。

7

2025.12.24

AppleID格式
AppleID格式

本专题整合了AppleID相关内容,阅读专题下面的文章了解更多详细教程。

12

2025.12.24

csgo视频观看入口合集
csgo视频观看入口合集

本专题整合了csgo观看入口合集,阅读下面的文章了知道更多入口地址。

371

2025.12.24

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 2.9万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 1.7万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 2.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号