`
yiminghe
  • 浏览: 1460315 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

又见 with

阅读更多

起因:


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

 

 

 

 

0
1
分享到:
评论

相关推荐

    Extending the Linear Model with R

    这种模型能够同时考虑不同层级的影响因素,例如在临床试验中,研究可能涉及多个医院的数据,每个医院又有多个患者的数据。在这种情况下,使用混合效应模型可以有效地处理数据中存在的群组间差异和群组内差异。 - **...

    Machine Learning Projects with TensorFlow 2.0:Supercharge your Machine Learning

    视频教程见: May 1, 2020 Machine Learning Projects with TensorFlow 2.0: Supercharge your Machine Learning skills with Tensorflow 2 English | MP4 | AVC 1920×1080 | AAC 48KHz 2ch | 4h 20m | 965 MB...

    Machine Learning with Python

    - 监督学习:利用带有标签的训练数据,训练出一个模型来预测未来或未见数据的结果。比如,在垃圾邮件过滤中,使用已知的垃圾邮件和非垃圾邮件作为训练数据来训练模型,然后用此模型来预测一封新邮件是否为垃圾邮件。...

    ImageNet Classification with Deep Convolutional Neural Networks.pdf

    - 过拟合是指模型在训练数据上学习得太好,以至于无法泛化到未见过的数据上。这会导致模型在实际应用中的表现不佳。 - 正则化是一种防止过拟合的技术,通过向模型的损失函数添加额外的惩罚项来实现。这可以促使...

    rsm-xx-with-dependencies-3.1.0-SNAPSHOT.zip

    需要rsm-lettuce-with-dependencies-3.1.0-SNAPSHOT.jar和rsm-redisson-with-dependencies-3.1.0-SNAPSHOT.jar两个jar包,相关配置见https://blog.csdn.net/ylfmsn/article/details/105114115

    Advanced Digital Design with the Verilog HDL(另有更新,见本人资源)【1-2】

    本资源作废,本人资源中有更新 英文2002版。印度某出版社影印。 本书通过大量完整的实例讲解了使用VerilogHDL进行超大规模集成电路设计的结构化建模方法、关键步骤和设计验证方法等实用内容。...

    reducing the dimensionality of data with neural networks---hinton

    高维数据不仅使得计算变得复杂和缓慢,而且还会导致过拟合的风险增加,使得模型在未见数据上的表现下降。因此,如何有效地降低数据的维度成为了一个重要的研究课题。 G.E.Hinton和R.R.Salakhutdinov提出了一种通过...

    Jim Liang Get started with machine learning 学习笔记 上(1-310页)

    这通常涉及将测试集输入模型,通过计算一些性能指标如准确度、召回率、F1分数、ROC曲线下面积等,来度量模型对未见数据的泛化能力。 5. 模型部署:一旦模型通过评估,就可以部署到生产环境中,开始对真实世界的数据...

    Achieving Your Most Important Goals with Objectives and Key Results

    - **设定合适的目标难度**:找到既具有挑战性又可实现的目标并非易事。 - **保持一致性**:随着项目的进展,团队可能需要不断调整目标,以适应变化的情况。 - **全员参与**:确保所有团队成员都能理解和参与到...

    Grid path planning with deep reinforcement learning

    实验表明,使用神经Q学习算法的智能体能够可靠地学习如何在未知环境中导航,即便这些环境在训练过程中从未出现过,这也预示着在更大且未曾见过的地图上具有潜在的成功可能性。 关键词:路径规划,强化学习,神经...

    Contextual Classification with Functional Max-Margin Markov Networks

    《Contextual Classification with Functional Max-Margin Markov Networks》是一篇由Daniel Munoz撰写的论文,主要探讨了在马尔科夫随机场(Markov Random Fields, MRFs)框架下进行上下文分类的高级能量优化方法。...

    EMPIRICAL BAYES TRANSDUCTIVE META-LEARNING WITH SYNTHETIC GRADIENTS

    它与归纳学习不同,后者是通过标记数据来推断出一个能够对任何未见过的数据进行预测的模型。转导学习在处理少量标记数据时特别有用,因为它能直接从查询集中学习信息。 第四,合成梯度(Synthetic gradients)是一...

    SecureCRT with SecureFX集成绿色版

    SecureCRT with SecureFX 强大的WINDOWS下管理LINUX系统软件,支持SSH FTP SFTP 串口链接设备。 注册码见sn.txt 另有算号器,运行算号器需安装vc2010运行环境

    Machine Learning with TensorFlow Version 10

    在监督学习中,算法从标记的训练数据中学习,然后使用这些数据来预测未来的结果或对未见过的数据进行分类。在无监督学习中,算法从没有标签的数据中学习,其目的是发现隐藏的结构或模式。强化学习侧重于如何在环境中...

    Regression with Keras.zip

    5. **预测脚本**:训练完成后,模型可以用来对新的、未见过的数据进行预测。 6. **结果可视化**:可能还包括一些代码来展示模型的性能,比如损失曲线、准确率图或者预测值与真实值的散点图。 回归任务在深度学习中...

    Mastering the game of Go with deep neural networks and tree search 中英文

    《Mastering the Game of Go with Deep Neural Networks and Tree Search》是Google DeepMind团队在2016年发表于《自然》杂志的一篇里程碑式论文,它详细介绍了如何使用深度神经网络和蒙特卡洛树搜索(MCTS)来创建...

    long-short-term-memory-networks-with-python.7z

    **长短期记忆网络(LSTM)详解** 长短期记忆网络(Long Short-Term Memory, LSTM)是一种...提供的“long-short-term-memory-networks-with-python.pdf”可能涵盖这些内容,是深入理解LSTM原理和技术实践的好资源。

    Animals With Attributes 标签图像数据集

    在零样本学习中,模型需要识别从未见过的新类别,仅仅依靠已知类别和它们的属性描述;而在少样本学习中,模型需要在仅有的几个样例上学习新类别。 总之,"Animals With Attributes"数据集为研究和开发基于属性的...

    coderush12.2.6 with regaddin

    Code rush 是DevExpree推出的一款VS上的插件。具有强大的文件和代码导航功能,易于访问的重构和代码创建功能、一组编辑器、选择、剪贴板工具等。功能包括使用中生成(Generate From ...存到我的云中,见txt中url进行下载

Global site tag (gtag.js) - Google Analytics