1

私はこのコードを持っています:

function boo() {
    this.is_global = "Yes!";
}

を実行するとboo();is_globalオブジェクトwindowがあります。つまり、is_globalグローバルコンテキストに入ります。
is_globalboo機能しているだけだと思っていました。

これは正常な動作ですか?

4

4 に答える 4

5

はい、これは正常な動作です。関数がグローバルに定義されている場合、thisは正義windowであり、追加されるものwindowはすべてグローバルです。

于 2012-11-03T19:24:37.950 に答える
2

thisウィンドウを指します。関数を参照する場合は、次を使用します。

arguments.callee.is_global = "Yes!";

今:

window.is_global; //undefined
boo.is_global; //"Yes!"

別の方法は、プロパティを追加するときにbooを独自の名前で参照することです。

function boo() {
    boo.is_global = "Yes!";
}

booこれにより、元の関数オブジェクトが変更されることに注意してください。代わりにコンストラクターとして使用した結果のすべてのインスタンスを変更する場合はboo、ここで他の回答を参照してください。

于 2012-11-03T19:25:08.983 に答える
1

「呼び出される関数」にthisなるには、(を使用して)オブジェクトコンストラクターとして関数を呼び出す必要がありますnew

var foo = new boo();

これにより、プロパティを持つのインスタンスが作成されます。これにより、コンストラクター関数自体にプロパティが作成されることはありません。デモをご覧くださいboois_global

を使用しない場合new(またはなどのメソッドapply)は、this「関数が呼び出されるオブジェクト」です。この場合、オブジェクトがないため、デフォルトのオブジェクトが使用されます。Webブラウザーのコンテキストでは、デフォルトのオブジェクトはwindowです。それで:

var foo = boo();

と同じです

var foo = window.boo();

と中thisです。windowboo

于 2012-11-03T19:26:28.517 に答える
1

MDNのキーワードの紹介をthis確認してください。

ローカル変数を宣言したかったので、varステートメントを使用します。

于 2012-11-03T19:27:14.230 に答える