[英]Javascript - function constructor with new keyword
當下面的foo
函數用new
調用時,它將變成一個構造函數,該函數返回分配給baz
的對象。
function foo() {
this.baz = "baz";
console.log(`${this.bar} ${baz}`);
}
var bar = "bar";
var baz = new foo(); // prints undefined undefined
問題是,為什么控制台語句內的baz
會獲得undefined
值-可以說在提升baz
同時調用new foo()直到函數返回baz
未分配返回的對象,這是正確的嗎?
后面一行中的console.log(baz)
正確打印返回的對象。
在功能方面,沒有bar
在this
。 您需要刪除this.bar
的this
部分。 對於baz
,必須使用this.baz
,因為它已附加到對象實例。
function foo() { this.baz = "baz"; console.log(`${bar} ${this.baz}`); } var bar = "bar"; var baz = new foo();
該代碼意味着
this.baz = "baz";
console.log(`${this.bar} ${baz}`);
當您創建一個對象時,它將只有baz
。 在主體中,如果要訪問對象的屬性,則需要通過this
進行訪問。 ${baz}
是未定義的,因為沒有baz
變量(它不會在this
查找)。因此,如果您需要在函數中訪問baz
,則需要使用this.baz
。
${this.bar}
, this
沒有bar
屬性,只有baz
。
變量baz
在執行構造函數時不存在。 在構造函數執行后創建baz
。
如果您使用IIFE,它的工作原理類似:
var test = (function() {
console.log(test) // undefined
return 'test'
}())
console.log(test) // 'test'
MDN鏈接將幫助您了解this
含義。
在函數內部使用,它指向當前對象。 實際含義由調用該函數的方式指定。 如果您在對象上使用圓點符號或方括號符號來調用它,則該對象將變為此。 如果呼叫未使用點符號,則表示全局對象。
因此,您正在function foo()
內調用this.bar
。 您將得到undefined
因為函數foo()沒有bar
屬性。
另外,當您僅在function foo ()
內調用bar
時,它將開始查找bar屬性。
首先在function foo ()
內部,然后搜索global
是否具有bar屬性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.