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 相关文章推荐
JQuery调webservice实现邮箱验证(检测是否可用)
May 21 Javascript
使用npm发布Node.JS程序包教程
Mar 02 Javascript
JavaScript获取当前日期是星期几的方法
Apr 06 Javascript
JS实现兼容各种浏览器的高级拖动方法完整实例【测试可用】
Jun 21 Javascript
ES6新特性五:Set与Map的数据结构实例分析
Apr 21 Javascript
前端主流框架vue学习笔记第二篇
Jul 26 Javascript
Three.js实现绘制字体模型示例代码
Sep 26 Javascript
Vue.JS项目中5个经典Vuex插件
Nov 28 Javascript
angular 数据绑定之[]和{{}}的区别
Sep 25 Javascript
VUE 动态组件的应用案例分析
Dec 02 Javascript
原生js实现无缝轮播图
Jan 11 Javascript
Javascript call及apply应用场景及实例
Aug 26 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批量生成随机用户名
2008/07/10 PHP
PHP define函数的使用说明
2008/08/27 PHP
php 引用(&)详解
2009/11/20 PHP
php whois查询API制作方法
2011/06/23 PHP
如何使用PHP实现javascript的escape和unescape函数
2013/06/29 PHP
限制ckeditor上传图片文件大小的方法
2013/11/15 PHP
php导入大量数据到mysql性能优化技巧
2014/12/29 PHP
Yii获取当前url和域名的方法
2015/06/08 PHP
实例简介PHP的一些高级面向对象编程的特性
2015/11/27 PHP
javascript作用域和闭包使用详解
2014/04/25 Javascript
WebSocket+node.js创建即时通信的Web聊天服务器
2016/08/08 Javascript
JavaScript三种绑定事件方式及相互之间的区别分析
2017/01/10 Javascript
js实现自动播放匀速轮播图
2020/02/06 Javascript
javascript设计模式 ? 外观模式原理与用法实例分析
2020/04/15 Javascript
浅谈vue中使用编辑器vue-quill-editor踩过的坑
2020/08/03 Javascript
python 控制语句
2011/11/03 Python
对Python中画图时候的线类型详解
2019/07/07 Python
Djang的model创建的字段和参数详解
2019/07/27 Python
将 Ubuntu 16 和 18 上的 python 升级到最新 python3.8 的方法教程
2020/03/11 Python
浅谈Python __init__.py的作用
2020/10/28 Python
Python爬虫Scrapy框架CrawlSpider原理及使用案例
2020/11/20 Python
浅析Python模块之间的相互引用问题
2021/02/26 Python
利用css3画个同心圆示例代码
2017/07/03 HTML / CSS
某公司部分笔试题
2013/11/05 面试题
旅游安全协议书
2014/04/21 职场文书
期中考试反思800字
2014/05/01 职场文书
环保倡议书范文
2014/05/12 职场文书
单位委托书怎么写
2014/09/21 职场文书
党员自我剖析材料范文
2014/10/06 职场文书
四风问题自我剖析材料
2014/10/07 职场文书
2014年留守儿童工作总结
2014/12/10 职场文书
2015年前台接待工作总结
2015/05/04 职场文书
如何制定一份可行的计划!
2019/06/21 职场文书
《工作是最好的修行》读后感3篇
2019/12/13 职场文书
“鬼灭之刃”热度不减,其成功背后的原因是什么?
2022/03/22 日漫
java项目构建Gradle的使用教程
2022/03/24 Java/Android