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 相关文章推荐
自写的一个jQuery圆角插件
Oct 26 Javascript
常规表格多表头查询示例
Feb 21 Javascript
Javascript 计算字符串在localStorage中所占字节数
Oct 21 Javascript
js实现上传文件添加和删除文件选择框
Oct 24 Javascript
jQuery grep()方法详解及实例代码
Oct 30 Javascript
jQuery Chosen通用初始化
Mar 07 Javascript
Angular4学习笔记之实现绑定和分包
Aug 01 Javascript
Webpack devServer中的 proxy 实现跨域的解决
Jun 15 Javascript
JavaScript事件冒泡与事件捕获实例分析
Aug 01 Javascript
React中阻止事件冒泡的问题详析
Apr 12 Javascript
layui表格内放置图片,并点击放大的实例
Sep 10 Javascript
js实现贪吃蛇游戏(简易版)
Sep 29 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+mysql写的简单留言本实例代码
2008/07/25 PHP
使用php shell命令合并图片的代码
2011/06/23 PHP
解析PHP提交后跳转
2013/06/23 PHP
PHP获取昨天、今天及明天日期的方法
2016/02/03 PHP
Javascript实例教程(19) 使用HoTMetal(6)
2006/12/23 Javascript
jQuery 处理网页内容的实现代码
2010/02/15 Javascript
原生js拖拽(第一课 未兼容)拖拽思路
2013/03/29 Javascript
Jquery实现点击切换图片并隐藏显示内容(2种方法实现)
2013/04/11 Javascript
js简单实现HTML标签Select联动带跳转
2013/10/23 Javascript
jQuery之字体大小的设置方法
2014/02/27 Javascript
JS处理json日期格式化问题
2015/10/01 Javascript
JS实现合并两个数组并去除重复项只留一个的方法
2015/12/17 Javascript
JavaScript里 ==与===区别详解
2016/08/16 Javascript
原生JS实现图片轮播与淡入效果的简单实例
2016/08/21 Javascript
JavaScript reduce和reduceRight详解
2016/10/24 Javascript
详解JS中的快速排序与冒泡
2017/01/10 Javascript
如何理解Vue的.sync修饰符的使用
2017/08/17 Javascript
vue router demo详解
2017/10/13 Javascript
vue中的router-view组件的使用教程
2018/10/23 Javascript
关于layui表单中按钮自动提交的解决方法
2019/09/09 Javascript
JavaScript代码实现简单计算器
2020/12/27 Javascript
[01:30]2016国际邀请赛中国区预选赛神秘商店火爆开启
2016/06/26 DOTA
[47:21]Liquid vs TNC Supermajor 胜者组 BO3 第一场 6.4
2018/06/05 DOTA
[47:52]DOTA2-DPC中国联赛正赛 iG vs LBZS BO3 第二场 3月4日
2021/03/11 DOTA
Linux下通过python访问MySQL、Oracle、SQL Server数据库的方法
2016/04/23 Python
python虚拟环境virtualenv的使用教程
2017/10/20 Python
python:print格式化输出到文件的实例
2018/05/14 Python
pycharm不以pytest方式运行,想要切换回普通模式运行的操作
2020/09/01 Python
Python使用Selenium模拟浏览器自动操作功能
2020/09/08 Python
Python截图并保存的具体实例
2021/01/14 Python
SneakerStudio英国:最佳运动鞋商店
2019/05/22 全球购物
武汉瑞得软件笔试题
2015/10/27 面试题
同学聚会欢迎辞
2014/01/14 职场文书
《老山界》教学反思
2014/04/08 职场文书
2015年党员自我剖析材料
2014/12/17 职场文书
详解Javascript实践中的命令模式
2021/05/05 Javascript