3

キーワードを使用して宣言されたグローバル変数はvarキーワードを使用して削除できないという本(JavaScript - 決定版ガイド第6版)を読みましたdelete。しかし、Firebug コンソールで実行することはできます。

var a = 1;
delete a;// should return false but returns true in firebug.

私はそれを理解することができません、なぜこれが起こっているのですか?

編集

私の質問は、グローバル変数の設定を解除する方法についてではなく、キーワードを使用して行ったようにグローバル変数を宣言すると、varキーワードを使用して削除できないグローバル オブジェクトの構成不可能なプロパティが作成されることdeleteです。しかし、私は Firebug コンソールでそれを行うことができますが、これは起こるべきではありません。

4

6 に答える 6

2

Firebug コンソールのコードは で実行されevalます。また、eval コードで作成された変数バインディングは可変であり (これは、まだ宣言されていない変数に依存します)、削除できます。

ECMAScript 言語仕様のセクション 10.5 項目​​ 2を参照してください。

codeが eval コードの場合、configurableBindingstrueします。それ以外の場合は、 configurableBindingsfalseにします。

項目 8.ci:

envの CreateMutableBinding 具象メソッドを呼び出し、引数としてdnconfigurableBindingsを渡します。

セクション 10.2.1 の表 17 とともに:

CreateMutableBinding(N, D)
環境レコードに新しい可変バインディングを作成します。文字列値Nは、バインドされた名前のテキストです。オプションのブール引数Dtrueの場合、バインディングは後で削除できます。

于 2013-07-05T15:34:24.853 に答える
2

@NagaJolokia が指摘しているように、コンソールはコードの実行にdelete使用しているため、Firebug コンソールでは動作が異なります。eval()

delete通常のコードと の下の両方でa をテストすると、同じ効果が動作で確認できますeval()。このページを保存し、開発者コンソールを開いた状態でブラウザーにロードします。

<!DOCTYPE html>
<html>
<head>
    <title>Eval/Delete Test</title>
    <script>
        console.log( 'Normal code, a = 1' );
        var a = 1;
        console.log( 'a is', typeof a, a );
        console.log( 'window.a is', typeof window.a, window.a );
        console.log( 'delete a OK?', delete a );
        console.log( 'delete window.a OK?', delete window.a );
        console.log( 'a is now', typeof a, window.a );
        console.log( 'window.a is now', typeof window.a, window.a );
        console.log( ' ' );
        console.log( 'Eval code, b = 1' );
        eval( 'var b = 1;' );
        console.log( 'delete b OK?', delete b );
        console.log( 'b is now', typeof b, window.b );
    </script>
</head>
<body>
</body>
</html>

コードはログに記録します:

Normal code, a = 1
a is number 1
window.a is number 1
delete a OK? false
delete window.a OK? false
a is now number 1
window.a is now number 1

Eval code, b = 1
delete b OK? true
b is now undefined undefined

また、同じコードをすぐに実行できるようにフィドルを作成しました。上記と同じ出力が生成されます。フィドルにはFirebug Liteが含まれているため、開発者コンソールを開く必要はありません。

より完全な説明については、NagaJolokia の回答と、この記事の Firebug の混乱に関するセクションを参照してください

于 2013-07-06T08:30:45.173 に答える
2

ここに詳細な回答があります

動作しますが、技術的には動作するはずです

delete window.some_var; 

ターゲットがオブジェクト プロパティでない場合、delete はノーオペレーションであると想定されています。例えば、

(function() {
   var foo = 123;
   delete foo; // wont do anything, foo is still 123
   var bar = { foo: 123 };
   delete bar.foo; // foo is gone
}());

しかし、グローバル変数は実際には window オブジェクトのメンバーであるため、機能します。

プロトタイプ チェーンが関係している場合、delete の使用はより複雑になります。これは、ターゲット オブジェクトからプロパティを削除するだけで、プロトタイプは削除しないためです。例えば、

function Foo() {}
Foo.prototype = { bar: 123 };
var foo = new Foo();
// foo.bar is 123
foo.bar = 456;
// foo.bar is now 456
delete foo.bar;
// foo.bar is 123 again.

ので注意してください。

編集: 私の答えはやや不正確です(最後の「誤解」を参照してください)。リンクはすべての悲惨な詳細を説明していますが、要約すると、ブラウザと削除元のオブジェクトによって大きな違いがある可能性があります. delete object.somePropである限り、一般的に安全object !== windowです。var適切な状況下では可能ですが、宣言された変数を削除するためにそれを使用することはまだありません。

于 2013-07-05T13:10:02.250 に答える
0

スペルミスをしたようです

var trueval = 1;
delete truevar;//spelling mistake here
于 2013-07-05T13:09:59.427 に答える
0

グローバル変数を削除することはできませんが、これは好きです

function Foo() {}

Foo.prototype = { bar: 123 };

var foo = new Foo();

// foo.bar is 123

foo.bar = 456;

// foo.bar is now 456

delete foo.bar;
// foo.bar is 123 again.

JavaScript 変数の設定を解除する には?

http://perfectionkills.com/understanding-delete/

于 2013-07-05T13:10:08.130 に答える
0

スペルをチェックする

truevar != trueval
于 2013-07-05T13:08:51.110 に答える