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 相关文章推荐
实现png图片和png背景透明(支持多浏览器)的方法
Sep 08 Javascript
js中widow.open()方法使用详解
Jul 30 Javascript
javascript 10进制和62进制的相互转换
Jul 31 Javascript
js查看一个函数的执行时间实例代码
Sep 12 Javascript
极易被忽视的javascript面试题七问七答
Feb 15 Javascript
Javascript简写条件语句(推荐)
Jun 12 Javascript
完美实现八种js焦点轮播图(上篇)
Jul 18 Javascript
HTML中使背景图片自适应浏览器大小实例详解
Apr 06 Javascript
Popup弹出框添加数据实现方法
Oct 27 Javascript
微信小程序传值以及获取值方法的详解
Apr 29 Javascript
解决Layui数据表格的宽高问题
Sep 28 Javascript
vue如何使用外部特殊字体的操作
Jul 30 Javascript
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使用curl访问https示例分享
2014/01/17 PHP
php实现对两个数组进行减法操作的方法
2015/04/17 PHP
浅析PHP类的反射来实现依赖注入过程
2018/02/06 PHP
PHP四种排序算法实现及效率分析【冒泡排序,插入排序,选择排序和快速排序】
2018/04/27 PHP
PHP设计模式之模板方法模式实例浅析
2018/12/20 PHP
PHP常见字符串操作函数与用法总结
2019/03/04 PHP
?牟┛途W扣了一??效果出?? target=
2007/05/27 Javascript
JQuery Dialog的内存泄露问题解决方法
2010/06/18 Javascript
基于jquery的多彩百分比 动态进度条 投票效果显示效果实现代码
2011/08/28 Javascript
js隐藏与显示回到顶部按钮及window.onscroll事件应用
2013/01/25 Javascript
javascript操作html控件实例(javascript添加html)
2013/12/02 Javascript
jquery实现的一个简单进度条效果实例
2014/05/12 Javascript
textarea不能通过maxlength属性来限制字数的解决方法
2014/09/01 Javascript
DOM操作一些常用的属性汇总
2015/03/13 Javascript
JavaScript中停止执行setInterval和setTimeout事件的方法
2015/05/14 Javascript
js实现楼层导航功能
2017/02/23 Javascript
vue中实现滚动加载更多的示例
2017/11/08 Javascript
vue里面父组件修改子组件样式的方法
2018/02/03 Javascript
vue自定义移动端touch事件之点击、滑动、长按事件
2018/07/10 Javascript
JavaScript笛卡尔积超简单实现算法示例
2018/07/30 Javascript
详解babel升级到7.X采坑总结
2019/05/12 Javascript
JS阻止事件冒泡的方法详解
2019/08/26 Javascript
python3实现读取chrome浏览器cookie
2016/06/19 Python
Python多叉树的构造及取出节点数据(treelib)的方法
2019/08/09 Python
python2与python3爬虫中get与post对比解析
2019/09/18 Python
django框架中间件原理与用法详解
2019/12/10 Python
如何通过python实现全排列
2020/02/11 Python
【魔兽争霸3重制版】原版画面与淬火MOD画面对比
2021/03/26 魔兽争霸
公司新员工的演讲稿注意事项
2014/01/01 职场文书
聚美优品的广告词
2014/03/14 职场文书
亮剑精神演讲稿
2014/05/23 职场文书
2014年学校领导班子对照检查材料
2014/09/19 职场文书
拾金不昧表扬信
2015/01/16 职场文书
分析ZooKeeper分布式锁的实现
2021/06/30 Java/Android
解决Jenkins集成SonarQube遇到的报错问题
2021/07/15 Java/Android
Python使用华为API为图像设置多个锚点标签
2022/04/12 Python