私はこのコードを持っています:
function boo() {
this.is_global = "Yes!";
}
を実行するとboo();
、is_global
オブジェクトwindow
があります。つまり、is_global
グローバルコンテキストに入ります。
私is_global
はboo
機能しているだけだと思っていました。
これは正常な動作ですか?
私はこのコードを持っています:
function boo() {
this.is_global = "Yes!";
}
を実行するとboo();
、is_global
オブジェクトwindow
があります。つまり、is_global
グローバルコンテキストに入ります。
私is_global
はboo
機能しているだけだと思っていました。
これは正常な動作ですか?
はい、これは正常な動作です。関数がグローバルに定義されている場合、this
は正義window
であり、追加されるものwindow
はすべてグローバルです。
this
ウィンドウを指します。関数を参照する場合は、次を使用します。
arguments.callee.is_global = "Yes!";
今:
window.is_global; //undefined
boo.is_global; //"Yes!"
別の方法は、プロパティを追加するときにbooを独自の名前で参照することです。
function boo() {
boo.is_global = "Yes!";
}
boo
これにより、元の関数オブジェクトが変更されることに注意してください。代わりにコンストラクターとして使用した結果のすべてのインスタンスを変更する場合はboo
、ここで他の回答を参照してください。
「呼び出される関数」にthis
なるには、(を使用して)オブジェクトコンストラクターとして関数を呼び出す必要がありますnew
。
var foo = new boo();
これにより、プロパティを持つのインスタンスが作成されます。これにより、コンストラクター関数自体にプロパティが作成されることはありません。デモをご覧ください。boo
is_global
を使用しない場合new
(またはなどのメソッドapply
)は、this
「関数が呼び出されるオブジェクト」です。この場合、オブジェクトがないため、デフォルトのオブジェクトが使用されます。Webブラウザーのコンテキストでは、デフォルトのオブジェクトはwindow
です。それで:
var foo = boo();
と同じです
var foo = window.boo();
と中this
です。window
boo
ローカル変数を宣言したかったので、var
ステートメントを使用します。