私はかなりjavascriptを初めて使いましたが、私はそれが危険で高速かつゆるやかな表現力に魅力的です。つまり、「厳密な使用」モードで操作すると、オブジェクトを削除できないことがわかりました。私は物事を削除するという巨大なファンではありません(理論的には、スコープはそれをどうにかして処理する必要があるからです)が、この機能を削除する背景には何があったのでしょうか?Javascript5厳密モードで削除が許可されないのはなぜですか?
答えて
delete
ステートメントは厳密モードでは許可されていますが、特定の用途には間違いがあります。これは、単純な名前ではなくオブジェクトのプロパティに対してのみ許可され、削除可能なオブジェクトのプロパティに対してのみ許可されます。
したがって
var a = {x: 0};
delete a.x;
は正常であるが、
delete Object.prototype;
を試みている間(後者は、実際の構文レベルのエラーではないではない、どちらも
delete a;
あります削除不能なプロパティを削除するのは実行時エラーです)
興味深い。なぜ実際のvar自体を削除できないのでしょうか? – sircodesalot
@sircodesalotローカル変数を削除するのはかなり変だからです。これは、コードブロックのセマンティクスを記述することをはるかに困難にします。 (私は実際に "正式な"論理的根拠を見たことはありません) – Pointy
@sircodesalot:スコープ内で変数のバインディングを変更することはできません。スコープに 'var foo'が含まれている場合、そのスコープ内の' foo'へのすべての参照は、そのスコープ用に作成された変数を参照します。さもなければ、外部スコープ内の変数 'foo'を参照します(存在する場合)。変数は実行文によって作成されるものではなく、それらによっても破棄されることはありません。 – supercat
[削除]でまたよく説明だ
// The delete statement is still allowed in strict mode, but some particular uses of it are erroneous. It's only allowed for object properties, not simple names, and only for object properties that can be deleted.
// "use strict";
// creates the property adminName on the global scope
adminName = "xyz";
// creates the property empCount on the global scope
// Since we are using var, this is marked as non-configurable. The same is true of let and const.
var empCount = 43;
EmployeeDetails = {
name: "xyz",
age: 5,
designation: "Developer"
};
// adminName is a property of the global scope.
// It can be deleted since it is created without var.
// Therefore, it is configurable.
console.log("delete adminName =", delete adminName); // returns true
// On the contrary, empCount is not configurable,
// since var was used.
console.log("delete empCount =", delete empCount); // returns false
// delete can be used to remove properties from objects
console.log("delete EmployeeDetails.name =", delete EmployeeDetails.name); // returns true
// Even when the property does not exists, it returns "true"
console.log("delete EmployeeDetails.salary =", delete EmployeeDetails.salary); // returns true
// delete does not affect built-in static properties
console.log("delete Math.PI =", delete Math.PI); // returns false
// EmployeeDetails is a property of the global scope.
// Since it defined without "var", it is marked configurable
console.log("delete EmployeeDetails =", delete EmployeeDetails); // returns true
x = 1;
var y = 2;
function f() {
var z = 44;
console.log("delete x =", delete x); // returns true
console.log("delete y =", delete y); // returns false
// delete doesn't affect local variable names
console.log("delete z =", delete z); // returns false
}
f.call();
- 1. 厳密モードのないJSON.parse
- 2. このインスタンスのarguments.calleeの厳密なモード
- 3. QMLの「厳密」モードですか?
- 4. 反時計回りの厳密なpareditモードで余分な角かっこを削除する
- 5. JUnit TemporaryFolderが削除されないのはなぜですか?
- 6. 厳密なモードで予約語「let」が予期せず使用される
- 7. htmlpurifierが許可されているIMGタグを削除するのはなぜですか?
- 8. WCFでメソッドオーバーロードが許可されないのはなぜですか?
- 9. Visual Studio 2010でデバッグモードが許可されないのはなぜですか?
- 10. "use"バインディングでパターンが許可されないのはなぜですか?
- 11. HTML 4.01の厳密な編集に最適なEmacsモードは何ですか?
- 12. 継承されたメンバーがなぜ許可されないのですか?
- 13. 非厳密モードでHTMLParserが開始タグを無視するのはなぜですか?
- 14. IE厳密モードのActiveXコントロールでのフリッカー
- 15. スタイリングテーブルの列が許可されないのはなぜですか?
- 16. AS3ライブラリは厳密モードではなく標準モードでコンパイルする必要がありますか?
- 17. なぜC++でテンプレートのオーバーロードが許可されないのですか?
- 18. Actionscript 3.0:オブジェクトウォーカーを厳密モードで表示
- 19. UIグリッド:エラー「厳密モードでは許可されていないプロパティの複数の定義[対象オブジェクト]」[IE-のみ]
- 20. このデフォルトのテンプレートパラメータは許可されないのはなぜですか?
- 21. ChromeでAjaxの許可ドメインが許可されていない
- 22. Function.lengthをオーバーライドして厳密なモードで配列の長さを返す方法
- 23. MonadFix厳密な言語で
- 24. JS:厳密でないモードで同じ名前の2つ以上のオブジェクトプロパティ?
- 25. Checkstyleで保護された変数がデフォルトで許可されないのはなぜですか?
- 26. 厳密なモードで画像の後ろに不思議な余白/余白が表示される
- 27. jQuery - 属性が削除されないのはなぜですか? .removeAttr
- 28. なぜPHPセッションがページリロードで削除されるのですか?
- 29. なぜ非同期ファイルが.netで削除されないのですか?
- 30. インターフェイスでパブリックメソッドのみが許可されるのはなぜですか?
例を詳細に説明している:[MDN厳密モード(https://developer.mozilla.org/en- US/docs/JavaScript/Reference/Functions_and_function_scope/Strict_mode) "*エラーをエラーに変換する*" –