我有這樣的代碼:爲什麼使用this在函數中聲明一個全局變量?
function boo() {
this.is_global = "Yes!";
}
當我運行boo();
,我有is_global
在window
對象,我的意思是is_global
進入全球背景下。
我希望is_global
只在boo
功能。
這是正常行爲嗎?
我有這樣的代碼:爲什麼使用this在函數中聲明一個全局變量?
function boo() {
this.is_global = "Yes!";
}
當我運行boo();
,我有is_global
在window
對象,我的意思是is_global
進入全球背景下。
我希望is_global
只在boo
功能。
這是正常行爲嗎?
this
指向窗口。如果你想指的是功能,用途:
arguments.callee.is_global = "Yes!";
現在:
window.is_global; //undefined
boo.is_global; //"Yes!"
的另一種方法是簡單地指通過自己的名稱屬性添加到它的時候噓。
function boo() {
boo.is_global = "Yes!";
}
請注意,這會修改原始的boo
函數對象。如果您希望修改所有實例的boo
而不是將其作爲構造函數使用,請參閱此處的其他答案。
是的,這是正常的行爲。如果您的功能是全局定義的,則this
只是window
,而添加到window
的任何內容都是全局的。
要讓this
成爲「正在調用的函數」,則必須將該函數作爲對象構造函數調用(使用new
)。
var foo = new boo();
這將創建一個boo
例如與財產is_global
。這不會在構造函數本身上創建一個屬性。 See a demo。
如果您不使用new
(或諸如apply
的方法),則this
是「調用該函數的對象」。由於在這種情況下沒有對象,因此使用默認對象。在Web瀏覽器的情況下,默認對象是window
。所以:
var foo = boo();
相同
var foo = window.boo();
和this
是window
內boo
。
結帳MDN's introduction to the this
keyword。
我想你想申報一個局部變量,所以使用var
statement。
你不能使用'arguments.callee'是嚴格模式;這是最好的避免。 – Quentin
@Quentin好吧,增加了一個替代方案。 –
所以使用'var is_global =「Yes」;'和'boo.is_global =「是!」之間有什麼區別? –