位置: 编程技术 - 正文

理解javascript中的with关键字(对于javascript理解)

编辑:rootadmin

推荐整理分享理解javascript中的with关键字(对于javascript理解),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:javascript的理解,如何理解javascript,如何理解javascript,javascript原理详解,javascript原理详解,javascript深入理解,简要说明javascript的作用,javascript深入理解,内容如对您有帮助,希望把文章链接给更多的朋友!

说起js中的with关键字,很多小伙伴们的第一印象可能就是with关键字的作用在于改变作用域,然后最关键的一点是不推荐使用with关键字。听到不推荐with关键字后,我们很多人都会忽略掉with关键字,认为不要去管它用它就可以了。但是有时候,我们在看一些代码或者面试题的时候,其中会有with关键字的相关问题,很多坑是你没接触过的,所以还是有必要说说with这一个关键字。

一、基本说明

在js高级程序设计中是这样描述with关键字的:with语句的作用是将代码的作用域设置到一个特定的作用域中,基本语法如下:

使用with关键字的目的是为了简化多次编写访问同一对象的工作,比如下面的例子:

这几行代码都是访问location对象中的属性,如果使用with关键字的话,可以简化代码如下:

在这段代码中,使用了with语句关联了location对象,这就以为着在with代码块内部,每个变量首先被认为是一个局部变量,如果局部变量与location对象的某个属性同名,则这个局部变量会指向location对象属性。注意:在严格模式下不能使用with语句。

二、with关键字的弊端

前面的基本说明中,我们可以看到with的作用之一是简化代码。但是为什么不推荐使用呢?下面我们来说说with的缺点:

1、性能问题2、语义不明,调试困难

三、性能问题

首先说说性能问题,关于使用with关键字的性能问题,首先我们来看看两段代码:

第一段代码是没有使用with关键字:

第二段代码使用了with关键字:

理解javascript中的with关键字(对于javascript理解)

在使用了with关键字后了,代码的性能大幅度降低。第二段代码的with语句作用到了obj2这个对象上,然后with块里面访问的却是obj对象。有一种观点是:使用了with关键字后,在with块内访问变量时,首先会在obj2上查找是否有名为obj的属性,如果没有,再进行下一步查找,这个过程导致了性能的降低。但是程序性能真正降低的原因真的是这样吗?我们修改一下第二段代码,修改如下:

这段代码将with语句作用到了obj对象上,然后直接使用a访问obj的a属性,按照前面说到的观点,访问a属性时,是一次性就可以在obj上找到该属性的,但是为什么代码性能依旧降低了呢。真正的原因是:使用了with关键字后,JS引擎无法对这段代码进行优化。JS引擎在代码执行之前有一个编译阶段,在不使用with关键字的时候,js引擎知道a是obj上的一个属性,它就可以静态分析代码来增强标识符的解析,从而优化了代码,因此代码执行的效率就提高了。使用了with关键字后,js引擎无法分辨出a变量是局部变量还是obj的一个属性,因此,js引擎在遇到with关键字后,它就会对这段代码放弃优化,所以执行效率就降低了。使用with关键字对性能的影响还有一点就是js压缩工具,它无法对这段代码进行压缩,这也是影响性能的一个因素。

四、语义不明,难以调试

前面说到除了性能的问题,with还存在的一个缺点语义不明,难以调试,就是造成代码的不易阅读,而且可能造成潜在的bug。

这段代码很容易理解了,在foo函数内,使用了with关键字来访问传进来的obj对象,然后修改a属性。当传入o1对象时,因为o1对象存在着a属性,所以这样没有问题。传入o2对象时,在修改a属性时,由于o2对象没有a这个属性,所以被修改的a属性则变成了全局变量。这就造成了潜在的bug。

五、延伸分析

前面说了那么多,相信大家已经理解了为什么不推荐使用with关键字以及可能存在的问题。下面我们来看看一些更复杂的情况,看下面的代码:

在这段代码中,分别输出,,undefined的。涉及的知识点也比较多:with关键字,this关键字,变量提升等等,我们来一一解释一下。1、this关键字关于this关键字的文章google上面相当多,这里不再赘述,我们只需记住一点:this关键字始终指向调用函数的对象。在这里,foo函数中,this指向的就是obj对象。因此在with(this)语句块里面,可以直接通过x变量来访问obj的x属性。2、变量提升js中的变量提升也是一个经常遇到的问题,我们可以简单理解成在js中,变量声明会被提升到函数的顶部,尽管有的时候,它是在后面声明的。

所以上面的代码可以解析为:

上面的注释中,解释了代码的执行过程,相信大家已经理解了为什么会出处,,undefined的原因。

有兴趣的同学可以看看下面这段代码:

这段代码会输出什么?为什么呢?

总结

本文总结了with语句的特点和弊端,总的来说,强烈不推荐使用with关键字。其实在日常编码中,我们只需要知道不去使用with就可以了,但是有的时候我们可能会遇到一些关于with的奇奇怪怪的问题,想要找出真正的原因,就要深入理解with关键字,这有助于我们去深入学习JS这门语言,同时也是学习JS的一个乐趣。

仅行代码实现Javascript中的MVC 从年左右开始,MVC逐渐在前端领域大放异彩,并终于在刚刚过去的年随着ReactNative的推出而迎来大爆发:AngularJS、EmberJS、Backbone、ReactJS、RiotJS、VueJS

谷歌showModalDialog()方法不兼容出现对话窗口的解决办法 showModalDialog,在测试中,IE,Firefox中正常运行,但是在google中,点击后没什么反应,在网上看了一下,谷歌浏览器不支持showModalDialog模态对话框和无法

JS中call/apply、arguments、undefined/null方法详解 a.call和apply方法详解--------------------------------------------------------------------------------call方法:语法:call([thisObj[,arg1[,arg2[,[,.argN]]]]])定义:调用一个对象的一

标签: 对于javascript理解

本文链接地址:https://www.jiuchutong.com/biancheng/381665.html 转载请保留说明!

上一篇:在ASP.NET MVC项目中使用RequireJS库的用法示例(asp.net mvc view)

下一篇:仅30行代码实现Javascript中的MVC(代码行数不够了,怎么弄多行)

  • 借递延所得税资产贷其他综合收益
  • 什么叫简易税
  • 记账凭证核算形式是会计核算中最基本的核算形式
  • 固定成本和变动成本之和称作
  • 利润表报错了怎么撤回修改
  • 城建税有没减半
  • 存货项目包括哪些具体内容
  • 承兑差额怎么做账
  • 应收账款贷方余额表示什么
  • 电子缴税付款凭证
  • 如何知道企业交了多少税
  • 异地预缴企业所得税
  • 企业应缴的教育费附加税是多少?
  • 7月认证的发票7月可以抵扣吗?
  • 城市建设维护税怎么计算
  • 个体工商户转为个人独资企业
  • 资产负债率之比
  • 向分公司拨款如何填现金流量表
  • 事业单位固定资产标准
  • 空调安装工程如何做
  • 存货跌价准备转销
  • 购入商品款项尚未入库
  • 增值税减免税备案什么时候开始
  • 商贸公司怎么结算成本
  • 同一控制下合并对价怎么算
  • 飞机票可以直接去机场买吗
  • ie异常
  • 小规模固定资产会计科目
  • 应用程序错误0x000000
  • 无形资产商标设计图片
  • 预缴附加税款会退税吗
  • 汽车销售公司取名字参考大全图片
  • launcher.exe是什么,每次开机都是否需要进行更改
  • 个人所得税应该计入什么科目
  • macOS Big Sur 11.2 RC 3(版本号20D64)预览版正式发布(附更新内容)
  • 新开的酒店怎么做宣传
  • codeigniter 教程
  • 劳务所得和经营所得有啥区别
  • php转换器
  • php 微信公众号
  • php批量上传图片到服务器
  • 进口货物交哪些税费
  • php注册系统
  • 小规模纳税人通行费可以抵扣吗
  • 揭秘蟹卡骗局
  • 专项附加扣除哪种申报方式好
  • 专票金额高于实收金额
  • 固定资产处置的账务处理 终于搞明白了!
  • 出差会计处理
  • 企业清算所得税申报
  • 生产成本和营业成本的区别和联系
  • 制造费用主要核算项目
  • 应付账款与实际付款有差异如何分录
  • 应收账款周转率越大越好还是越小越好
  • 半成品会计处理流程
  • 企业给加盟店的钱怎么算
  • 一次性工伤医疗补助金怎么领取
  • 财务负责人和办税员可以是一个吗
  • 运费未付的会计分录怎么做
  • 一般纳税人哪些项目可以简易征收
  • 代办营业执照安全可靠吗
  • 非营利医疗机构什么意思
  • 结账时能否用红笔写名字
  • mysql 5.7.34安装
  • 韩国电脑用什么系统
  • linux中的rm是什么意思
  • 物联网 iot
  • linux特殊权限命令
  • win8隐藏的文件夹怎么找出来
  • win7访问共享文件夹没有权限访问
  • ExtJS4中的requires使用方法示例介绍
  • 网络自定义怎么打开
  • bat修改ip地址
  • 批量压缩命令
  • 并结合案例进行深入剖析
  • Python 正则表达式的高级用法
  • 安卓表格布局案例
  • 类库怎么用
  • 耕地占用税林地有减免吗
  • 江西省国家税务局
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设