起因:
Nicholas C. Zakas 又一次抨击了邪恶的 with,并将以前的在压缩代码中带来的弊端
总结了起来。
但是如果你想详细了解下怎么回事,查查权威的OReilly.JavaScript.The.Definitive.Guide 也只能这样:
"This behavior, and the reasons behind it, are too complicated to explain here. "
规范:
这次仔细看了下规范的相关with部分,希望能够解释清楚:
1.首先是环境记录(就是常说的作用域吧)相关的条目:
10.2.1 Environment Records
Declarative environment : FunctionDeclarations, VariableDeclarations, and Catch
WithStatement:Object environment
函数,变量声明,catch都在execution context的LexicalEnvironment增加了一个声明环境记录,而with语句则增加了一个对象环境记录,对象环境记录和声明环境记录还是不一样的。
2.变量声明:
//1
(function () {
var obj = {};
with(obj) {
var x = 1;
}
alert(typeof x);
alert(typeof obj.x);
})();
alert(typeof x);
//2
(function () {
var obj = {x:2};
with(obj) {
var x = 1;
}
alert(typeof x);
alert(typeof obj.x);
})();
alert(typeof x);
12.2 VariableStatements
If a VariableDeclaration is nested within a with statement and the Identifier in the VariableDeclaration is the same as a property name of the binding object of the with statement’s object environment record, then step 4 will assign value to the property instead of to the VariableEnvironment binding of the Identifier.
10.5 Declaration Binding Instantiation
声明变量在声明环境下会执行10.5的常规操作,在当前的环境记录中绑定变量。而嵌套在with中(处于对象环境)时,则会特殊判断:如果绑定变量和对象属性名相同则直接设置对象属性值(代码行2),否则执行10.5,绑定在上一层的声明环境下(代码1)。
3.变量赋值
//1
(function () {
var obj = {};
with(obj) {
x = 1;
}
alert(typeof x);
alert(typeof obj.x);
})();
alert(typeof x);
//2
(function () {
var obj = {x:2};
with(obj) {
x = 1;
}
alert(typeof x);
alert(typeof obj.x);
})();
alert(typeof x);
11.13.1 simple assignment(=)
8.7.2 putValue[V,W]
If IsUnresolvableReference(V), then
a.If IsStrictReference(V) is true, then Throw ReferenceError exception.
b.Call the [[Put]] internal method of the global object, passing GetReferencedName(V) for the property name, W for the value, and false for the Throw flag.
关联环境记录中变量的查找,如果能够在最近的对象环境记录中找到相同的对象属性名则赋值对象属性(代码行2),否则沿着环境记录向上查找,找到对应环境记录的变量绑定并赋值,若最终找不到(strict现在统一false),则在全局对象中(global object)绑定变量,这正是我们应该避免的(代码行1)。
结语:
理解了上述三条,则相信对于理解 Nicholas C. Zakas说明的 为什么压缩代码不能对于with所在的作用域链的所有变量都不能简短命名的说法 能够有所帮助。
ps:其实 TBCompressor
比原始的 YUI Compressor好用!
ps2: 关于 eval
Ps3: NCZ javascript-minification-part-II
分享到:
相关推荐
Tobit与Probit模型Stata实现代码-最新发布.zip
Jupyter-Notebook
红警单机版(单机游戏)
SwiftUI编写的贪吃蛇小游戏讲解
1996-2020年中国文化旅游统计年鉴-最新数据发布.zip
Jupyter-Notebook
omwfa1hxz_1.apk
2001-2023年上市公司大数据应用指数数据集(6.1万样本,5600家企业,含原始数据、代码及结果,最新).zip
Jupyter-Notebook
Typora(version 1.2.3)导出 pdf 自定义水印的 frame.js 文件,详情可以查看:
量产部落sm2263xt开卡工具,支持b16b17颗粒
中国1公里分辨率月降水数据-最新全集.zip
云平台VPC.vsdx
CPA注会考试最新教材资料-最新发布.zip
分省最低工资标准面板数据最新集.zip
内容概要:本文档是一份详尽的Java面试题集,涵盖了许多常见的Java面试问题及详细的解答。内容涉及Java基础语法、面向对象编程、集合框架、网络编程、Spring框架等多个方面。每个问题不仅提供了答案,还解释了其背后的原理和技术细节。 适合人群:即将参加Java岗位面试的技术人员,特别是工作经验1-3年的软件工程师。 使用场景及目标:适用于准备Java面试,加深对Java核心技术的理解和掌握。通过练习这些问题,帮助面试者更好地理解和应对面试官的问题。 阅读建议:建议结合实际项目经验来阅读和练习这些问题,以便更好地理解和应用所学的知识点。同时,对于复杂的问题,可以通过编写代码来验证答案的正确性和理解深度。
层次分析法与熵值法工具包+数据案例+代码-最新.zip
音乐产品购物网站 SSM毕业设计 附带论文 启动教程:https://www.bilibili.com/video/BV1GK1iYyE2B
NASA DEM中国30省高分辨率地形数据-精心整理.zip
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。