javascript中的delete使用详解(6)

那么 ECMAScript 第 5 版中的严格模式将带来什么? 目前介绍了其中的一些限制。 当删除操作指向一个变量/函数参数/函数声明的直接引用时抛出 SyntaxError。 此外,如果属性拥有内部属性[[Configurable]] == false,将抛出 TypeError:

复制代码 代码如下:


(function(foo) {
    "use strict"; //在函数中开启严格模式

var bar;
    function baz;
    delete foo; // SyntaxError,当删除函数参数时
    delete bar; // SyntaxError,当删除变量时
    delete baz; // SyntaxError,当删除由函数声明创建的变量时

/* function实例的length拥有[[Configurable]] : false */
    delete (function() {}).length; // TypeError
}) ();

而且,在严格模式下,删除未声明的变量(换句话说,未解析的引用),同样抛出 SyntaxError; 与它类似的,相同模式下未声明的赋值也将抛出异常(ReferenceError)

复制代码 代码如下:


"use strict";
delete i_dont_exist; // SyntaxError
i_dont_exist_either = 1; // ReferenceError

看了之前给出的变量、函数声明和参数的例子,相信现在你也理解了,所有这些限制都是有其意义的。 严格模式采取了更积极的和描述性的措施,而不只是忽略这些问题。

八、总结 | Summary

由于这篇文章已经很长了,因此我就不再讨论另一些内容(e.g.通过 delete 删除数组项及其影响)。 你可以翻阅 或阅读规范然后自己测试。

下面是关于 Javascript 中 delete 如何工作的一个简单的总结:

•变量和函数声明都是活化(Activation)全局(Global)对象的属性。
•属性拥有内部属性,其中一个—— DontDelete 负责确定一个属性是否能够被删除。
•全局代码或函数代码中的变量、函数声明都生成拥有 DontDelete 的属性。
•函数参数同样是活化对象的属性,也拥有 DontDelete。
•Eval代码中的变量和函数声明都生成没有 DontDelete 的属性。
•新的未声明的属性在生成时带空的内部属性,因此也没有 DontDelete。
•宿主对象允许以任何它们期望的方式来响应删除过程。

原文:Understanding delete译文:javascript 中的 delete译者:justjavac

您可能感兴趣的文章:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wdgsjx.html