JavaScript严格模式禁用With语句的原因


Posted in Javascript onOctober 20, 2014

看了很多遍JavaScript严格模式,其中有说“禁用With语句”,以前看到这都是骑马观花,一带而过,因为平时就很少用到这个语句,禁不禁用对自己关系都不是很大。今天禁不住想知道为何“严格模式”就容不下with语句呢?

EcmaScript规范上说“with 语句用于设置代码在特定对象中的作用域”,可以看出,With语句改变了作用域链。

function Person(name,age,sex){
this.name = name;
this.age = age;
this.sex = sex;
}
(function(){
var title = '申请人:';
var zhangsan = new Person('张三',20,'男');
var str = '';
with(zhangsan){
str = title+name+',年龄'+age+'岁,'+sex+'性'+',职位'+job;
}
console.log(str);
})();

上面的代码会报Uncaught ReferenceError: job is not defined 。

如果将上面的with语句块改为

str = title+zhangsan.name+',年龄'+zhangsan.age+'岁,'+zhangsan.sex+'性'+',职位'+zhangsan.job;

则不报错,输出str 为:申请人:张三,年龄20岁,男性,职位undefined

对于with语句块中的变量,在执行时,都要在zhangsan中检查是否它的属性。

我们知道运行脚本时,需要两个过程,首先是编译,然后再执行。
很显然在编译的时候,不能确定zhangsan的这变量表示的对象有哪些属性。只能在执行时才能确定zhangsan是Person的一个实例。所以就不能在编译时确实with语句块中的变量是zhangsan的属性还是上一层变量作用域链中的变量。

这与严格模式有编译时就检查变量是否定义冲突,所以严格模式不会允许异已存在,因此严格模式禁用With语句,也就不难理解了。

Javascript 相关文章推荐
用js实现的仿sohu博客更换页面风格(简单版)
Mar 22 Javascript
autoIMG 基于jquery的图片自适应插件代码
Mar 12 Javascript
JQuery记住用户名和密码的具体实现
Apr 04 Javascript
jQuery晃动层特效实现方法
Mar 09 Javascript
整理Javascript流程控制语句学习笔记
Nov 29 Javascript
js获取客户端操作系统类型的方法【测试可用】
May 27 Javascript
JavaScript的继承实现小结
May 07 Javascript
qrcode生成二维码微信长按无法识别问题的解决
Apr 04 Javascript
微信小程序实现元素渐入渐出动画效果封装方法
May 18 Javascript
小程序如何构建骨架屏
May 29 Javascript
jQuery属性选择器用法实例分析
Jun 28 jQuery
在vue项目中封装echarts的步骤
Dec 25 Vue.js
jquery中页面Ajax方法$.load的功能使用介绍
Oct 20 #Javascript
JavaScript sup方法入门实例(把字符串显示为上标)
Oct 20 #Javascript
iframe里面的元素触发父窗口元素事件的jquery代码
Oct 19 #Javascript
js添加select下默认的option的value和text的方法
Oct 19 #Javascript
使用变量动态设置js的属性名
Oct 19 #Javascript
js控制鼠标事件移动及移出效果显示
Oct 19 #Javascript
js读取json的两种常用方法示例介绍
Oct 19 #Javascript
You might like
php中判断文件存在是用file_exists还是is_file的整理
2012/09/12 PHP
node.js中的fs.exists方法使用说明
2014/12/17 Javascript
javascript中String对象的slice()方法分析
2014/12/20 Javascript
浅谈Javascript中的Function与Object
2015/01/26 Javascript
JS实现网页表格自动变大缩小的方法
2015/03/09 Javascript
微信JSSDK上传图片
2015/08/23 Javascript
javascript 中的 delete及delete运算符
2015/11/15 Javascript
微信小程序 rpx 尺寸单位详细介绍
2016/10/13 Javascript
Jquery中.bind()、.live()、.delegate()和.on()之间的区别详解
2017/08/01 jQuery
使用Bootstrap + Vue.js实现表格的动态展示、新增和删除功能
2017/11/27 Javascript
基于vue2实现上拉加载功能
2017/11/28 Javascript
vue-cli3访问public文件夹静态资源报错的解决方式
2020/09/02 Javascript
[59:36]2018DOTA2亚洲邀请赛 4.3 突围赛 Secret vs VG 第二场
2018/04/04 DOTA
在Python中操作字典之update()方法的使用
2015/05/22 Python
Python中的fileinput模块的简单实用示例
2015/07/09 Python
在Django中限制已登录用户的访问的方法
2015/07/23 Python
浅谈终端直接执行py文件,不需要python命令
2017/01/23 Python
Python入门必须知道的11个知识点
2018/03/21 Python
django rest framework 数据的查找、过滤、排序的示例
2018/06/25 Python
python list格式数据excel导出方法
2018/10/31 Python
Python日志无延迟实时写入的示例
2019/07/11 Python
使用numpngw和matplotlib生成png动画的示例代码
2021/01/24 Python
Python用SSH连接到网络设备
2021/02/18 Python
加拿大女包品牌:Matt & Nat
2017/05/12 全球购物
FC-Moto西班牙:摩托车手最大的购物场所之一
2019/04/11 全球购物
乌克兰移动电子产品和相关配件的在线商店:iTMag
2020/03/16 全球购物
《燕子》教学反思
2014/02/18 职场文书
保密工作实施方案
2014/02/24 职场文书
留守儿童工作方案
2014/06/02 职场文书
2015大学生自我评价范文
2015/03/03 职场文书
4S店销售内勤岗位职责
2015/04/13 职场文书
2015年幼儿园班主任工作总结
2015/05/12 职场文书
拖欠货款起诉状
2015/05/20 职场文书
新员工入职感想
2015/08/07 职场文书
公务员岗前培训心得体会
2016/01/08 职场文书
使用Python获取字典键对应值的方法
2022/04/26 Python