5

グーグルクロームコンソールで次のコードを実行すると、次の結果が得られます

var x = 1;

alert(delete x); // false

eval('var y = 2');

alert(delete y); // true

最初の例では変数が削除されず、2番目の例では変数が削除されるのはなぜですか?

4

1 に答える 1

2

Mozilla JS Docs からdelete:

deleteオブジェクトのプロパティに対してのみ有効です。変数名や関数名には影響しません。

提供された例はあなたのものに似ています。

x = 42;         // creates the property x on the global object
var y = 43;     // declares a new variable, y

delete x;       // returns true  (x is a property of the global object and can be deleted)
delete y;       // returns false (delete doesn't affect variable names)

では、なぜ機能alert(delete y);するのでしょうか。正確な答えを突き止めることはできませんでしたが、基本的に eval のスコープに依存することはできません。

eval('var y = 2');は変数として宣言されず、プロパティとして扱われると思いますが、テストの結果以外にその証拠をまだ見つけていません。正確な理由を見つけられるかどうかを確認するために、調査を続けます。

eval奇妙さに関する他の記事:


編集 0

@Xavier Holt のコメントに基づいて、巻き上げとスコープについて調べましたevalMozilla Dev docs のこのスコープ チートシートには、次の内容が含まれていました。

eval は割り当てをキャプチャできますが、var 宣言はキャプチャできません

eval'd vars は通常どおりホイストするため、eval は次のような割り当てをキャプチャする場合があります。

function f() {   {
    let x = "inner";
    eval("var x = 'outer'");
    print(x); // "outer"   } 
}

私がこれを正しく読んでいれば、以前の仮定は正しかった. 変数を宣言することによって宣言をeval()評価しません。varが機能するには、プロパティを作成するか、プロパティとして扱う必要がありますdelete

于 2012-12-14T13:41:49.587 に答える