[英]why does this return undefined - javascript
我對js很新。 如果這聽起來很蠢,我很抱歉。 但為什么下面的代碼返回“undefined”
function NewPerson(name, age, sex){
this.name = name;
this.age = age;
this.sex = sex;
this.getName = function(){
//alert(this.name);
alert("The age is "+this.age);
};
}
var obj1 = new NewPerson("Mark",25,"Male");
alert("The age is as follows "+obj1.getName());
//輸出:
年齡為25歲。未定義年齡如下
因為你沒有退貨。
你必須徹底回歸你的功能
以下應該工作
function NewPerson(name, age, sex){
this.name = name;
this.age = age;
this.sex = sex;
this.getName = function(){
//alert(this.name);
alert("The age is "+this.age);
return this.age
};
}
var obj1 = new NewPerson("Mark",25,"Male");
alert("The age is as follows "+obj1.getName());
沒有人提到它所以我會 - 在構造函數的原型上放置對所有實例都相同的函數會更有效。 然后,您只有一個所有實例使用的函數實例,例如
function NewPerson(name, age, sex){
this.name = name;
this.age = age;
this.sex = sex;
}
NewPerson.prototype.getName = function() {
alert("The age is "+this.age);
return this.name;
}
@Davenewton的答案是正確的,雖然我喜歡它的直截了當,但需要這樣做
着名的哈哈! 你完全明白為什么的那一刻。 這是真正發生的事情:
所以詳細說明如果我們有這樣的事情:
function i_am(){ var a = 'very smart person'; console.log(this.a); } var a = 'monkey'; i_am();
根據您可能使用的linter或瀏覽器,這可能會返回
> "monkey" // (try the snippet)
或者也
> "monkey"
> undefined // check the sreenshot
這是因為一個簡單的原因,如果我們逐步地編譯器“讀取”代碼,那就最好理解了。
function i_am()
聲明提升到頂部( undefined
) var a
聲明提升到頂部( undefined
) 'monkey'
分配給變量a
(現在為字符串"monkey"
) i_am()
我們預先聲明的函數 a
並指定字符串"very smart person"
console.log(this.a)
返回'monkey'
,因為this
引用了global
對象的var
/ property a
(在本例中是相同的) - call-site來自global
對象: i_am();
現在,根據您的環境,它會隱藏您undefined
結果,或者將其打印出來! 為什么? 因為function
s希望return
一個值。 就像變量聲明一樣,如果你這樣做的話
var a; console.log(a);
它沒有被賦值,因此它在undefined
RHS之后產生。
類似的原則適用於函數,它正在尋找返回值,但它不會返回任何內容,因此導致undefined
換句話說, 它不是this
是return
小號undefined
。 這是i_am();
的調用i_am();
返回undefined
!
希望現在每個人都清楚:)
如果你想從被調用的函數中獲取一些值,你必須使用
return value;
所以試試吧
function NewPerson(name, age, sex){
this.name = name;
this.age = age;
this.sex = sex;
this.getName = function(){
alert("The age is "+this.age);
return this.name;
};
}
var obj1 = new NewPerson("Mark",25,"Male");
alert("The name is as follows "+obj1.getName());
將按預期工作。
如前所述,您沒有在getName
返回任何內容。
看起來你真的不想在getName
提醒年齡。 此外,將getName
添加到構造函數中對象的每個實例都是低效的。 請改用原型方法。 我正在提交清理代碼,以滿足您的需求:
function Person(name, age, sex) {
this.name = name;
this.age = age;
this.sex = sex;
};
Person.prototype.getName = function() {
return this.name;
};
var obj1 = new Person("Mark",25,"Male");
alert("The name is: "+obj1.getName());
通過在原型上放置getName
,Person的所有實例都可以訪問相同的函數,從而節省內存:)通過在構造函數Person中使用語句this.getName = ...
,您將為每個實例創建一個新函數人
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.