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 相关文章推荐
Javascript实例教程(19) 使用HoTMetal(5)
Dec 23 Javascript
jQuery使用手册之二 DOM操作
Mar 24 Javascript
什么是JavaScript
Aug 13 Javascript
JavaScript表单通过正则表达式验证电话号码
Mar 14 Javascript
js实现的类似于asp数据字典的数据类型代码实例
Sep 03 Javascript
Bootstrap每天必学之基础排版
Nov 20 Javascript
学习JavaScript设计模式之单例模式
Jan 19 Javascript
jQuery代码性能优化的10种方法
Jun 21 Javascript
JavaScript基本语法_动力节点Java学院整理
Jun 26 Javascript
基于js Canvas实现二次贝塞尔曲线
Dec 25 Javascript
解决VUE双向绑定失效的问题
Oct 29 Javascript
关于vue.js中实现方法内某些代码延时执行
Nov 14 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来处理多个提交任务
2006/10/09 PHP
PHP命名空间用法实例分析
2019/09/04 PHP
Jquery Ajax学习实例 向页面发出请求,返回XML格式数据
2010/03/14 Javascript
jQuery获取动态生成的元素示例
2014/06/15 Javascript
jquery.validate使用时遇到的问题
2015/05/25 Javascript
JS实现黑色大气的二级导航菜单效果
2015/09/18 Javascript
JS中改变this指向的方法(call和apply、bind)
2016/03/26 Javascript
JS集成fckeditor及判断内容是否为空的方法
2016/05/27 Javascript
JS正则替换去空格的方法
2017/03/24 Javascript
angularjs的select使用及默认选中设置
2017/04/08 Javascript
使用vue构建一个上传图片表单
2017/07/04 Javascript
Three.js利用性能插件stats实现性能监听的方法
2017/09/25 Javascript
Node.js事件的正确使用方法
2019/04/05 Javascript
layui表格分页 记录勾选的实例
2019/09/02 Javascript
详解javascript中var与ES6规范中let、const区别与用法
2020/01/11 Javascript
JavaScript中的this原理及6种常见使用场景详解
2020/02/14 Javascript
pycharm 使用心得(七)一些实用功能介绍
2014/06/06 Python
Python模拟登录验证码(代码简单)
2016/02/06 Python
Python 常用string函数详解
2016/05/30 Python
Python模拟鼠标点击实现方法(将通过实例自动化模拟在360浏览器中自动搜索python)
2017/08/23 Python
Python中的探索性数据分析(功能式)
2017/12/22 Python
如何在django里上传csv文件并进行入库处理的方法
2019/01/02 Python
对python判断ip是否可达的实例详解
2019/01/31 Python
Ubuntu18.04中Python2.7与Python3.6环境切换
2019/06/14 Python
用Pytorch训练CNN(数据集MNIST,使用GPU的方法)
2019/08/19 Python
python plotly画柱状图代码实例
2019/12/13 Python
Tensorflow 实现释放内存
2020/02/03 Python
Python日志处理模块logging用法解析
2020/05/19 Python
Python连接HDFS实现文件上传下载及Pandas转换文本文件到CSV操作
2020/06/06 Python
美国最大的在线寄售和旧货店:Swap.com
2018/08/27 全球购物
英语文学专业学生的自我评价
2013/10/31 职场文书
自荐信怎么写
2015/03/04 职场文书
辩护词范文大全
2015/05/21 职场文书
golang通过递归遍历生成树状结构的操作
2021/04/28 Golang
django 认证类配置实现
2021/11/11 Python
一次SQL如何查重及去重的实战记录
2022/03/13 MySQL