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监控数据是否变化(修正版)
Apr 12 Javascript
javascript:void(0)是什么意思示例介绍
Nov 17 Javascript
js replace替换所有匹配的字符串
Feb 13 Javascript
JS使用for循环遍历Table的所有单元格内容
Aug 21 Javascript
jQuery中ready事件用法实例
Jan 19 Javascript
DOM基础教程之使用DOM + Css
Jan 20 Javascript
浅谈使用MVC模式进行JavaScript程序开发
Nov 10 Javascript
BootStrap学习系列之布局组件(下拉,按钮组[toolbar],上拉)
Jan 03 Javascript
AngularJS实用基础知识_入门必备篇(推荐)
Jul 10 Javascript
vue2利用Bus.js如何实现非父子组件通信详解
Aug 25 Javascript
Vue实现商品分类菜单数量提示功能
Jul 26 Javascript
js实现简易点击切换显示或隐藏
Nov 29 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动态实现表格跨行跨列实现代码
2012/11/06 PHP
利用中国天气预报接口实现简单天气预报
2014/01/20 PHP
PHP实现一维数组与二维数组去重功能示例
2018/05/24 PHP
PHP基于openssl实现非对称加密代码实例
2020/06/19 PHP
js 操作符实例代码
2009/10/24 Javascript
js如何设置在iframe框架中指定div不显示
2013/12/04 Javascript
JavaScript在for循环中绑定事件解决事件参数不同的情况
2014/01/20 Javascript
页面js遇到乱码问题的解决方法是和无法转码的情况
2014/04/30 Javascript
基于jquery实现智能表单验证操作
2016/05/09 Javascript
Boostrap基础教程之JavaScript插件篇
2016/09/08 Javascript
Angular2利用组件与指令实现图片轮播组件
2017/03/27 Javascript
vue v-model表单控件绑定详解
2017/05/17 Javascript
vue-cli2打包前和打包后的css前缀不一致的问题解决
2018/08/24 Javascript
vue-cli 使用axios的操作方法及整合axios的多种方法
2018/09/12 Javascript
vue开发环境配置跨域的方法步骤
2019/01/16 Javascript
JS实现集合的交集、补集、差集、去重运算示例【ES5与ES6写法】
2019/02/18 Javascript
富文本编辑器vue2-editor实现全屏功能
2019/05/26 Javascript
深入浅析golang zap 日志库使用(含文件切割、分级别存储和全局使用等)
2020/02/19 Javascript
详解Python编程中对Monkey Patch猴子补丁开发方式的运用
2016/05/27 Python
Python基于SMTP协议实现发送邮件功能详解
2018/08/14 Python
python3.x实现base64加密和解密
2019/03/28 Python
python如何制作英文字典
2019/06/25 Python
python进度条显示之tqmd模块
2020/08/22 Python
python 三种方法实现对Excel表格的读写
2020/11/19 Python
Pytorch模型迁移和迁移学习,导入部分模型参数的操作
2021/03/03 Python
详解CSS3中Media Queries的相关使用
2015/07/17 HTML / CSS
ManoMano英国:欧洲第一家专注于DIY和园艺市场的电商平台
2020/03/12 全球购物
在线实验室测试:HealthLabs.com
2020/05/03 全球购物
接口中的方法可以是abstract的吗
2015/07/23 面试题
口腔工艺技术专业毕业生自荐信
2013/09/27 职场文书
应届生求职推荐信
2013/10/28 职场文书
英语演讲稿3分钟
2014/04/29 职场文书
自动化专业毕业生求职信
2014/06/18 职场文书
2015小学五年级班主任工作总结
2015/05/21 职场文书
初中化学教学反思
2016/02/22 职场文书
Redis官方可视化工具RedisInsight安装使用教程
2022/04/19 Redis