那么 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
您可能感兴趣的文章: