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删除字符串最后一个字符
Jan 14 Javascript
avascript中的自执行匿名函数应用示例
Sep 15 Javascript
浅谈JavaScript数据类型及转换
Feb 28 Javascript
JS+CSS实现自动切换的网页滑动门菜单效果代码
Sep 14 Javascript
jQuery实现的给图片点赞+1动画效果(附在线演示及demo源码下载)
Dec 31 Javascript
js添加绑定事件的方法
May 15 Javascript
jQuery对checkbox 复选框的全选全不选反选的操作
Aug 09 Javascript
JS中BOM相关知识点总结(必看篇)
Nov 22 Javascript
使用vue-route 的 beforeEach 实现导航守卫(路由跳转前验证登录)功能
Mar 22 Javascript
详解Vuex下Store的模块化拆分实践
Jul 31 Javascript
jQuery HTML css()方法与css类实例详解
May 20 jQuery
vue 项目软键盘回车触发搜索事件
Sep 09 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执行linux系统命令的常用函数使用说明
2010/04/27 PHP
php cli换行示例
2014/04/22 PHP
用PHP代替JS玩转DOM的思路及示例代码
2014/06/15 PHP
php计算一个文件大小的方法
2015/03/30 PHP
使用JavaScript创建新样式表和新样式规则
2016/06/14 PHP
PHP图像处理技术实例总结【绘图、水印、验证码、图像压缩】
2018/12/08 PHP
在laravel中使用with实现动态添加where条件
2019/10/10 PHP
php5与php7的区别点总结
2019/10/11 PHP
一个javascript图片阅览组件
2010/11/09 Javascript
jQuery源码解读之removeClass()方法分析
2015/02/20 Javascript
JavaScript 面向对象与原型
2015/04/10 Javascript
js实现HashTable(哈希表)的实例分析
2016/11/21 Javascript
JS基于设计模式中的单例模式(Singleton)实现封装对数据增删改查功能
2018/02/06 Javascript
node的process以及child_process模块学习笔记
2018/03/06 Javascript
nodejs(officegen)+vue(axios)在客户端导出word文档的方法
2018/07/31 NodeJs
Node.js使用supervisor进行开发中调试的方法
2019/03/26 Javascript
微信JS-SDK updateAppMessageShareData安卓不能自定义分享详解
2019/03/29 Javascript
基于Vue的商品主图放大镜方案详解
2019/09/19 Javascript
vue自动添加浏览器兼容前后缀操作
2020/08/13 Javascript
Python三元运算实现方法
2015/01/12 Python
Python中使用OpenCV库来进行简单的气象学遥感影像计算
2016/02/19 Python
django基础之数据库操作方法(详解)
2017/05/24 Python
python中ASCII码字符与int之间的转换方法
2018/07/09 Python
Python走楼梯问题解决方法示例
2018/07/25 Python
Python实现的IP端口扫描工具类示例
2019/02/15 Python
简单了解Java Netty Reactor三种线程模型
2020/04/26 Python
HTML5 文件域+FileReader 分段读取文件并上传到服务器
2017/10/23 HTML / CSS
微信小程序之html5 canvas绘图并保存到系统相册
2019/06/20 HTML / CSS
有趣的睡衣和礼物:LazyOne
2019/11/27 全球购物
文件中有一组整数,要求排序后输出到另一个文件中
2012/01/04 面试题
英语道歉信范文
2014/01/09 职场文书
艺校音乐专业自我鉴定范文
2014/03/01 职场文书
2014年幼儿园植树节活动方案
2014/03/02 职场文书
2014年教师个人工作总结
2014/11/10 职场文书
2014幼儿园小班工作总结
2014/11/10 职场文书
关于运动会的广播稿
2015/08/19 职场文书