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 脚本的加载与执行
Apr 19 Javascript
用模版生成HTML的的框架jquery.tmpl使用详解
Jan 07 Javascript
JavaScript数组常用方法
Mar 02 Javascript
jQuery超酷平面式时钟效果代码分享
Mar 30 Javascript
JS实现横向与竖向两个选项卡Tab联动的方法
Sep 27 Javascript
javascript如何定义对象数组
Jun 07 Javascript
js实现表单及时验证功能 用户信息立即验证
Sep 13 Javascript
快速实现JS图片懒加载(可视区域加载)示例代码
Jan 04 Javascript
jQuery实现鼠标悬停3d菜单展开动画效果
Jan 19 Javascript
Vue2.0基于vue-cli+webpack父子组件通信(实例讲解)
Sep 14 Javascript
vue2.0.js的多级联动选择器实现方法
Feb 09 Javascript
Vue.js递归组件实现组织架构树和选人功能
Jul 04 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代码的53条建议
2008/03/27 PHP
php微信支付之APP支付方法
2015/03/04 PHP
大家须知简单的php性能优化注意点
2016/01/04 PHP
php使用Jpgraph创建折线图效果示例
2017/02/15 PHP
详解PHP防止直接访问.php 文件的实现方法
2017/07/28 PHP
Javascript模板技术
2007/04/27 Javascript
Js获取事件对象代码
2010/08/05 Javascript
常用Extjs工具:Extjs.util.Format使用方法
2012/03/22 Javascript
JavaScript Serializer序列化时间处理示例
2014/07/31 Javascript
jquery图片切换实例分析
2015/04/15 Javascript
javascript跑马灯抽奖实例讲解
2020/04/17 Javascript
javascript结合Flexbox简单实现滑动拼图游戏
2016/02/18 Javascript
JavaScript 经典实例日常收集整理(常用经典)
2016/03/30 Javascript
实现点击下箭头变上箭头来回切换的两种方法【推荐】
2016/12/14 Javascript
基于JavaScript实现百度搜索框效果
2020/06/28 Javascript
ExtJs整合Echarts的示例代码
2018/02/27 Javascript
layui table 参数设置方法
2018/08/14 Javascript
vue中filters 传入两个参数 / 使用两个filters的实现方法
2019/07/15 Javascript
JavaScript实现打砖块游戏
2020/02/25 Javascript
浅谈pytorch和Numpy的区别以及相互转换方法
2018/07/26 Python
python实现的MySQL增删改查操作实例小结
2018/12/19 Python
Win10 安装PyCharm2019.1.1(图文教程)
2019/09/29 Python
Python object类中的特殊方法代码讲解
2020/03/06 Python
python新手学习使用库
2020/06/11 Python
Gucci法国官方网站:意大利奢侈品牌
2018/07/25 全球购物
迪卡侬印尼体育用品商店:Decathlon印尼
2020/03/11 全球购物
当当网软件测试笔试题
2015/11/24 面试题
教师通用专业自荐书范文
2014/02/11 职场文书
企业挂职心得体会
2014/09/10 职场文书
党的群众路线教育实践活动心得体会范文
2014/11/05 职场文书
介绍信样本
2015/01/31 职场文书
全国爱眼日活动总结
2015/02/27 职场文书
高中历史教学反思
2016/02/19 职场文书
开学第一周日记(三篇范文)
2019/08/23 职场文书
Spring Data JPA框架持久化存储数据到数据库
2022/04/28 Java/Android
Python保存并浏览用户的历史记录
2022/04/29 Python