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 相关文章推荐
innerHTML,outerHTML,innerTEXT三者之间的区别
Jan 28 Javascript
js 判断 enter 事件
Feb 12 Javascript
javascript 定义初始化数组函数
Sep 07 Javascript
基于JQuery.timer插件实现一个计时器
Apr 25 Javascript
javascript:;与javascript:void(0)使用介绍
Jun 05 Javascript
JavaScript判断一个字符串是否包含指定子字符串的方法
Mar 18 Javascript
JavaScript简单实现弹出拖拽窗口(二)
Jun 17 Javascript
关于Vue.js一些问题和思考学习笔记(1)
Dec 02 Javascript
Javascript中Promise的四种常用方法总结
Jul 14 Javascript
基于iScroll实现下拉刷新和上滑加载效果
Jul 18 Javascript
AjaxUpLoad.js实现文件上传功能
Mar 02 Javascript
angular异步验证防抖踩坑实录
Dec 01 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下统计用户在线时间的一种尝试
2010/08/26 PHP
php笔记之:数据类型与常量的使用分析
2013/05/14 PHP
zf框架的session会话周期及次数限制使用示例
2014/03/13 PHP
PHP中mysqli_affected_rows作用行数返回值分析
2014/12/26 PHP
正确的PHP匹配UTF-8中文的正则表达式
2015/05/13 PHP
使用PHP实现生成HTML静态页面
2015/11/18 PHP
PHP微信API接口类
2016/08/22 PHP
Zend Framework动作控制器用法示例
2016/12/09 PHP
php实现支持中文的文件下载功能示例
2017/08/30 PHP
JavaScript的Cookies
2008/01/16 Javascript
js设置组合快捷键/tabindex功能的方法
2013/11/21 Javascript
jquery幻灯片插件bxslider样式改进实例
2014/10/15 Javascript
Bootstrap~多级导航(级联导航)的实现效果【附代码】
2016/03/08 Javascript
node.js实现博客小爬虫的实例代码
2016/10/08 Javascript
基于JavaScript实现轮播图原理及示例
2020/04/10 Javascript
Cropper.js 实现裁剪图片并上传(PC端)
2017/08/20 Javascript
详解Node.js 中使用 ECDSA 签名遇到的坑
2018/11/26 Javascript
深入剖析JavaScript instanceof 运算符
2019/06/14 Javascript
js实现坦克大战游戏
2020/02/24 Javascript
Python选择排序、冒泡排序、合并排序代码实例
2015/04/10 Python
Python 类与元类的深度挖掘 II【经验】
2016/05/06 Python
使用pyecharts无法import Bar的解决方案
2020/04/23 Python
python利用标准库如何获取本地IP示例详解
2017/11/01 Python
对python中使用requests模块参数编码的不同处理方法
2018/05/18 Python
Python利用ORM控制MongoDB(MongoEngine)的步骤全纪录
2018/09/13 Python
python爬虫 模拟登录人人网过程解析
2019/07/31 Python
Django继承自带user表并重写的例子
2019/11/18 Python
tensorflow 实现从checkpoint中获取graph信息
2020/02/10 Python
PyTorch加载自己的数据集实例详解
2020/03/18 Python
Python实现疫情地图可视化
2021/02/05 Python
CSS3 渐变(Gradients)之CSS3 线性渐变
2016/07/08 HTML / CSS
让IE6、IE7、IE8支持CSS3的脚本
2010/07/20 HTML / CSS
企业演讲稿范文
2013/12/28 职场文书
心理健康教育心得体会
2013/12/29 职场文书
集结号观后感
2015/06/08 职场文书
MySQL令人咋舌的隐式转换
2021/04/05 MySQL