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 相关文章推荐
extJs 下拉框联动实现代码
Apr 09 Javascript
javascript 随机展示头像实现代码
Dec 06 Javascript
用js小类库获取浏览器的高度和宽度信息
Jan 15 Javascript
你必须知道的JavaScript 变量命名规则详解
May 07 Javascript
java与javascript之间json格式数据互转介绍
Oct 29 Javascript
Javascript模块化编程详解
Dec 01 Javascript
Jquery中find与each方法用法实例
Feb 04 Javascript
jquery中change()用法实例分析
Feb 06 Javascript
学习javascript面向对象 理解javascript原型和原型链
Jan 04 Javascript
Vue.js中extend选项和delimiters选项的比较
Jul 17 Javascript
JS获取子、父、兄节点方法小结
Aug 14 Javascript
不得不看之JavaScript构造函数及new运算符
Aug 21 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/07/22 PHP
PHP 冒泡排序算法的实现代码
2010/08/08 PHP
排序算法之PHP版快速排序、冒泡排序
2014/04/09 PHP
php页面,mysql数据库转utf-8乱码,utf-8编码问题总结
2015/08/27 PHP
简单了解PHP编程中数组的指针的使用
2015/11/30 PHP
thinkphp3.2.3 分页代码分享
2016/07/28 PHP
Ubuntu彻底删除PHP7.0的方法
2018/07/27 PHP
javascript下有关dom以及xml节点访问兼容问题
2007/11/26 Javascript
javascript调试说明
2010/06/07 Javascript
DeviceOne 让你一见钟情的App快速开发平台
2016/02/17 Javascript
基于JS代码实现导航条弹出式悬浮菜单
2016/06/17 Javascript
Javascript OOP之面向对象
2016/07/31 Javascript
Vue.js学习笔记之 helloworld
2016/08/14 Javascript
如何用js判断dom是否有存在某class的值
2017/02/13 Javascript
微信小程序自定义组件
2017/08/16 Javascript
使用Vue制作图片轮播组件思路详解
2018/03/21 Javascript
Angular4 反向代理Details实践
2018/05/30 Javascript
Vue请求JSON Server服务器数据的实现方法
2018/11/02 Javascript
微信小程序实现工作时间段选择
2019/02/15 Javascript
python类继承与子类实例初始化用法分析
2015/04/17 Python
在Python中操作列表之List.pop()方法的使用
2015/05/21 Python
对Python 内建函数和保留字详解
2018/10/15 Python
python/sympy求解矩阵方程的方法
2018/11/08 Python
PyQt5使用QTimer实现电子时钟
2019/07/29 Python
将 Ubuntu 16 和 18 上的 python 升级到最新 python3.8 的方法教程
2020/03/11 Python
Tirendo比利时:在线购买轮胎
2018/10/22 全球购物
后勤岗位职责
2013/11/26 职场文书
实习评语
2013/12/16 职场文书
咖啡店的创业计划书,让你hold不住
2014/01/03 职场文书
超市采购员岗位职责
2014/02/01 职场文书
吨的认识教学反思
2014/04/27 职场文书
2014各大专业毕业生自我评价
2014/09/17 职场文书
解除劳动合同证明书
2014/09/26 职场文书
黄石寨导游词
2015/02/05 职场文书
交通安全月活动总结
2015/05/08 职场文书
家庭贫困证明
2015/06/16 职场文书