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 相关文章推荐
js输入框邮箱自动提示功能代码实现
Dec 10 Javascript
js判断字符长度及中英文数字等
Mar 19 Javascript
jquery缓动swing liner控制动画过程不同时刻的速度
May 29 Javascript
Jquery响应回车键直接提交表单操作代码
Jul 25 Javascript
js数值计算时使用parseInt进行数据类型转换(jquery)
Oct 07 Javascript
基于jquery实现表格无刷新分页
Jan 07 Javascript
解决JS内存泄露之js对象和dom对象互相引用问题
Jun 25 Javascript
angular4 JavaScript内存溢出问题
Mar 06 Javascript
vue获取当前激活路由的方法
Mar 17 Javascript
Node.js fs模块(文件模块)创建、删除目录(文件)读取写入文件流的方法
Sep 03 Javascript
JS 创建对象的模式实例小结
Apr 28 Javascript
JS如何调用WebAssembly编译出来的.wasm文件
Nov 05 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
支持数组的ADDSLASHES的php函数
2010/02/16 PHP
让你成为更出色的PHP开发者的10个技巧
2011/02/25 PHP
php通过array_shift()函数移除数组第一个元素的方法
2015/03/18 PHP
PHP多维数组转一维数组的简单实现方法
2015/12/23 PHP
php实现微信小程序授权登录功能(实现流程)
2019/11/13 PHP
最新28个很棒的jQuery 教程
2011/05/28 Javascript
JS获取地址栏参数的小例子
2013/08/23 Javascript
javaScript对文字按照拼音排序实现代码
2013/12/27 Javascript
js使用DOM设置单选按钮、复选框及下拉菜单的方法
2015/01/20 Javascript
jQuery实现的瀑布流加载效果示例
2016/09/13 Javascript
NodeJS学习笔记之Module的简介
2017/03/24 NodeJs
jquery插件canvaspercent.js实现百分比圆饼效果
2017/07/18 jQuery
深入理解React高阶组件
2017/09/28 Javascript
es6在react中的应用代码解析
2017/11/08 Javascript
NodeJS简单实现WebSocket功能示例
2018/02/10 NodeJs
Node.Js生成比特币地址代码解析
2018/04/21 Javascript
vue-router beforeEach跳转路由验证用户登录状态
2018/12/26 Javascript
angular2 NgModel模块的具体使用方法
2019/04/10 Javascript
vue设置导航栏、侧边栏为公共页面的例子
2019/11/01 Javascript
JS手写一个自定义Promise操作示例
2020/03/16 Javascript
Python基于正则表达式实现文件内容替换的方法
2017/08/30 Python
python使用Turtle库绘制动态钟表
2018/11/19 Python
Python对Excel按列值筛选并拆分表格到多个文件的代码
2019/11/05 Python
django项目中新增app的2种实现方法
2020/04/01 Python
详解python定时简单爬取网页新闻存入数据库并发送邮件
2020/11/27 Python
Feelunique澳大利亚:欧洲的化妆品零售电商
2019/12/18 全球购物
销售经理工作职责范文
2013/12/03 职场文书
农村婚礼证婚词
2014/01/08 职场文书
餐饮收银员岗位职责
2014/02/07 职场文书
《影子》教学反思
2014/02/21 职场文书
环境整治工作方案
2014/05/18 职场文书
个人四风问题整改措施
2014/10/24 职场文书
2014年协会工作总结
2014/11/22 职场文书
Prometheus 监控MySQL使用grafana展示
2021/08/30 MySQL
详解JavaScript中Arguments对象用途
2021/08/30 Javascript
分析MySQL优化 index merge 后引起的死锁
2022/04/19 MySQL