グーグルクロームコンソールで次のコードを実行すると、次の結果が得られます
var x = 1;
alert(delete x); // false
eval('var y = 2');
alert(delete y); // true
最初の例では変数が削除されず、2番目の例では変数が削除されるのはなぜですか?
グーグルクロームコンソールで次のコードを実行すると、次の結果が得られます
var x = 1;
alert(delete x); // false
eval('var y = 2');
alert(delete y); // true
最初の例では変数が削除されず、2番目の例では変数が削除されるのはなぜですか?
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 のコメントに基づいて、巻き上げとスコープについて調べましたeval
。Mozilla Dev docs のこのスコープ チートシートには、次の内容が含まれていました。
eval は割り当てをキャプチャできますが、var 宣言はキャプチャできません
eval'd vars は通常どおりホイストするため、eval は次のような割り当てをキャプチャする場合があります。
function f() { { let x = "inner"; eval("var x = 'outer'"); print(x); // "outer" } }
私がこれを正しく読んでいれば、以前の仮定は正しかった. 変数を宣言することによって宣言をeval()
評価しません。var
が機能するには、プロパティを作成するか、プロパティとして扱う必要がありますdelete
。