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代码经典广告
Oct 21 Javascript
javascript中window.event事件用法详解
Dec 11 Javascript
JavaScript中json对象和string对象之间相互转化
Dec 26 Javascript
JavaScript cookie的设置获取删除详解
Feb 11 Javascript
jquery ui bootstrap 实现自定义风格
Nov 14 Javascript
深入理解Node module模块
Mar 26 Javascript
JS实现可视化文件上传
Sep 08 Javascript
详解Vue组件之作用域插槽
Nov 22 Javascript
JS实现的tab切换并显示相应内容模块功能示例
Aug 03 Javascript
JavaScript 中的无穷数(Infinity)详解
Feb 13 Javascript
JS禁用右键、禁用Ctrl+u、禁用Ctrl+s、禁用F12的实现代码
Dec 01 Javascript
聊聊vue 中的v-on参数问题
Jan 29 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语法(4)
2006/10/09 PHP
我的论坛源代码(三)
2006/10/09 PHP
PHP MemCached 高级缓存应用代码
2010/08/05 PHP
PHP中echo和print的区别
2014/08/28 PHP
php实现的click captcha点击验证码类实例
2014/09/23 PHP
简单的无缝滚动程序-仅几行代码
2007/05/08 Javascript
js正则表达式中test,exec,match方法的区别说明
2014/01/29 Javascript
css+js实现部分区域高亮可编辑遮罩层
2014/03/04 Javascript
10分钟学会写Jquery插件实例教程
2014/09/06 Javascript
JS+DIV+CSS实现仿表单下拉列表效果
2015/08/18 Javascript
基于Bootstrap实现下拉菜单项和表单导航条(两个菜单项,一个下拉菜单和登录表单导航条)
2016/07/22 Javascript
nodejs模块学习之connect解析
2017/07/05 NodeJs
JavaScript实现跟随滚动缓冲运动广告框
2017/07/15 Javascript
分分钟学会vue中vuex的应用(入门教程)
2017/09/14 Javascript
vue如何获取自定义元素属性参数值的方法
2019/05/14 Javascript
JavaScript和TypeScript中的void的具体使用
2019/09/12 Javascript
Vue实现商品飞入购物车效果(电商项目)
2019/11/26 Javascript
微信小程序8种数据通信的方式小结
2020/02/03 Javascript
关于JavaScript中异步/等待的用法与理解
2020/11/18 Javascript
[01:06:26]全国守擂赛第二周 Team Coach vs DeMonsTer
2020/04/28 DOTA
Flask框架中密码的加盐哈希加密和验证功能的用法详解
2016/06/07 Python
python开发环境PyScripter中文乱码问题解决方案
2016/09/11 Python
python实现生成字符串大小写字母和数字的各种组合
2019/01/01 Python
django 捕获异常和日志系统过程详解
2019/07/18 Python
django-crontab 定时执行任务方法的实现
2019/09/06 Python
python 实现朴素贝叶斯算法的示例
2020/09/30 Python
python中字符串的编码与解码详析
2020/12/03 Python
菲律宾优惠券网站:MetroDeal
2019/04/12 全球购物
求高于平均分的学生学号及成绩
2016/09/01 面试题
花卉与景观设计系大学生求职信
2013/10/01 职场文书
化工专业大学生职业生涯规划书
2014/01/14 职场文书
物流专业求职信
2014/06/30 职场文书
导游词400字
2015/02/13 职场文书
2015清明节祭奠英烈寄语大全
2015/03/04 职场文书
建筑技术负责人岗位职责
2015/04/13 职场文书
Python爬虫实战之爬取携程评论
2021/06/02 Python