我很難理解爲什麼在嚴格模式下,當在非限定標識符上使用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
}());
嚴格模式必須在這裏做一個運行時檢查,因爲遇到此當一個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
事實上,我的理解,你是否能夠刪除的東西(在非嚴格模式下)取決於內部[[Configurable]]
屬性,並且與合格標識符無關。據我所知,有嚴格模式沒有辦法刪除非全局變量(如當地VO的屬性)是配置:
(function() {
// "use strict";
eval('var foo = 5;');
console.log(typeof foo); // number
delete foo; // works in non-strict, SyntaxError in strict.
console.log(typeof foo); // undefined
}());
所以,我的問題是,有什麼意義使用delete
上的非限定標識符時拋出一個SyntaxError,如果該屬性不可配置,TypeError會拋出異常?這似乎是一種不必要的限制,並且在某些情況下似乎沒有任何解決方法,除非不使用嚴格模式(第三個示例)。任何人都可以解釋這個決定背後的動機嗎?
更新:我剛剛意識到我忽視了直接eval
調用在嚴格模式下自己範圍的事實,而不是調用函數的範圍,所以在第三例foo
不會受到嚴格的模式來定義。無論如何,運行時檢查仍然會捕獲這個問題,但它引出了一個問題:在嚴格模式下沒有辦法配置局部變量,就像我們在非嚴格模式下使用eval
'd變量聲明? AFAIK是eval
爲數不多的合法用途之一。
調用究竟你的意思是什麼「(UN)合格標識」?我無法在規格中找到該術語。 – user123444555621
@ Pumbaa80一個沒有點的標識符。 :) –
@ Pumbaa80'(function(){「use strict」; var foo; delete foo;}())'... chromium:'SyntaxError:在嚴格模式下刪除一個不合格的標識符。' –