我无法理解为什么在严格模式下,delete
在非限定标识符上使用时会出现语法错误.
在大多数情况下,它是有道理的...如果你用通常的方式用var
关键字声明变量,然后尝试使用delete
它们,在非严格模式下它会无声地失败,所以严格模式失败是有意义的在这些情况下有错误.
不过,也有在那里你的情况下无法删除该标识符是合格的:
(function() {
// "use strict";
var obj = Object.create({}, { bloop: { configurable: false } });
delete obj.bloop; // throws TypeError in strict mode, silently fails in non-strict.
console.log('bloop' in obj); // true
}());
Run Code Online (Sandbox Code Playgroud)
严格模式必须在此处执行运行时检查,因为遇到此类型时会引发TypeError.在某些情况下,您可以在非严格模式下成功删除非限定标识符...
// "use strict";
window.bar = 6;
console.log(typeof bar); // number
delete bar; // works in non-strict, syntax error in strict!
console.log(typeof bar); // undefined
Run Code Online (Sandbox Code Playgroud)
事实上,根据我的理解,您是否可以删除内容(在非严格模式下)取决于内部[[Configurable]]
属性,并且与限定标识符无关.据我所知,在严格模式下无法删除非全局变量(作为本地VO的属性)是可配置的:
(function() …
Run Code Online (Sandbox Code Playgroud) foo; // ReferenceError: foo is not defined
typeof(foo); // undefined
Run Code Online (Sandbox Code Playgroud)
如何typeof
规避ReferenceError
何时提供未声明的变量标识符?这只是JavaScript解释器"神奇"还是可以用用户土地概念来解释?