2012-12-13 8 views
5

を削除2番目の例では削除されますか?と私はGoogleのクロームコンソールに次のコードを実行した場合は最初の例では変数が削除されていないのはなぜ私は次のような結果</p> <pre><code>var x = 1; alert(delete x); // false </code></pre> <hr> <pre><code>eval('var y = 2'); alert(delete y); // true </code></pre> <p>を取得

+6

ボーナスの質問:なぜあなたはこれを必要としますか? –

+1

私はあなたに技術的な詳細を教えることはできませんが、これはJavaScriptの "[hoisting](http://www.adequatelygood.com/2010/2/JavaScript-Scoping-and-Hoisting)"の動作に関係していると思われます。基本的に、 'var foo;'で定義された変数は特別な扱いを受けます。なぜなら、JSエンジンは関数が動作する前にそこにいることを知っているからです。'eval'で宣言された変数は認識されないので、特別な扱いを受けません。 –

+0

あなたはhttp://perfectionkills.com/understanding-delete/を読んでいますか? – Bergi

答えて

1

From the Mozilla JS Docs for delete

deleteは、オブジェクトのプロパティにのみ有効です。変数名または関数名には、 の効果はありません。

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

だから、alert(delete y);はなぜ機能しますか?私は正確な答えを釘付けにすることはできませんでしたが、基本的にあなたは評価の範囲に頼ることができません。

私はeval('var y = 2');が変数として宣言されないとがプロパティとして扱われますが、私は我々のテストの結果よりもさらに他のもののための証拠を発見していないと思います。私は正確な理由が見つかったかどうかを調査するつもりです。 evalすごみの

その他の記事:


EDIT 0

@Xavier Holtのコメントに基づいて、私はevalに関して吊り上げと範囲を調べました。 This scope cheatsheet from Mozilla Dev docsは、次のことを持っていた:

のevalは、割り当てを取り込むことができるが、試用版が持つと 同様の割り当てを取り込むことができるので、ないのvar宣言

eval'd VARSは、通常、ホイスト:

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

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

関連する問題

 関連する問題