3

Javascript メソッドに関するこの記事を読んでいて、次のdeleteコードを試しました。

function f(){
    var x = "abcd";
    console.log(delete x); //returns false, because x has DontDelete attribute
    y = "abcd";
    console.log(delete y); //returns true, but I didn't explicitly assign y as a property
}

これは奇妙です。なぜなら、(: のように) に対してプロパティの割り当てを使用してyないwindow.y="abcd";からです。delete

属性がyないのはなぜですか?DontDelete

アップデート:

以下の回答では、オブジェクトのプロパティであるという理由だけで y が削除可能であると主張されていwindowます。そうではありません。次のスニペットを検討してください。

function f() {
    var functionx = "abcd";
    console.log(delete functionx); //returns false, because x has DontDelete attribute
    functiony = "abcd";
    console.log(delete functiony); //returns true, but I didn't explicitly assign functiony as a property to the window
}

//take 1
var globalx = "abcd";
console.log(this.globalx);//to prove x is a property of the global
console.log(delete globalx);//fails, even though x is a property of the window

//take 2
this.globaly = "abcd";
console.log(this.globaly);//to prove y is a property of the global
console.log(delete globaly);//succeeds, because I used property assignment

f();

テイク 1 ではglobalx、ウィンドウのプロパティですが、まだ削除できません。成功するかどうかの基準deleteは、変数が何かのプロパティであるかどうか (常に true である) ではなく、そのプロパティにDontDelete属性が設定されているかどうかです。

4

3 に答える 3

2

delete xどのオブジェクト プロパティにも解決されないため、無効です。

yオブジェクトのプロパティに解決されwindowます。

https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/delete :

式を削除

がプロパティ参照に評価される場所

于 2012-11-03T17:58:22.890 に答える
1

2 番目の例の拡張バージョンを次に示します。

window.y = "abcd";
console.log(delete window.y);

何が起こっているのかは明らかです。

このキーワードを使用しない場合、インタプリタは、この JSFiddleに示すようにvar、変数がグローバル オブジェクト (通常は ) のプロパティであると想定します。グローバル スコープでは、オブジェクトと同じであることに注意してください。windowthiswindow

Re: 更新:

関数の外では、で宣言された変数は、グローバル オブジェクトの構成不可能なプロパティvarとして定義されます。これについては、https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Statements/varで詳しく説明されています。

関数の外での使用varはオプションです。宣言されていない変数に値を代入すると、それがグローバル変数 (グローバル オブジェクトのプロパティでもある) として暗黙的に宣言されます。違いは、宣言された変数はグローバル オブジェクトの構成不可能なプロパティであり、宣言されていない変数は構成可能であることです。

関数内で変数を宣言しても、それはグローバル プロパティに割り当てられず、ローカル変数に割り当てられます。

これは、グローバル スコープで変数を定義するときに見られる動作を説明しています。

于 2012-11-03T18:13:48.513 に答える
1

JavaScript の変数は、キーワードを使用して宣言さvarれます。を省略するvarと、インタープリターは、指定された変数が定義されている最も近いスコープを探し始めます。指定された変数が見つからない場合は、グローバル オブジェクトの新しいプロパティとして作成されます

これはまさにここで起こることです:

  • 変数yが参照され、新しい値が割り当てられます ( abcd)
  • Varyはどこにも定義されていません → 新しいグローバル プロパティyが作成され、値が割り当てられます (実質的にwindow.y = "abcd")。
  • その結果、y削除可能なグローバル オブジェクトのプロパティになります。
于 2012-11-03T17:58:38.267 に答える