簡體   English   中英

為什么這會返回undefined -javascript

[英]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

在此輸入圖像描述

這是因為一個簡單的原因,如果我們逐步地編譯器“讀取”代碼,那就最好理解了。

  1. function i_am()聲明提升到頂部( undefined
  2. var a聲明提升到頂部( undefined
  3. 'monkey'分配給變量a (現在為字符串"monkey"
  4. 執行/調用i_am()我們預先聲明的函數
  5. 創建一個局部變量a並指定字符串"very smart person"
  6. console.log(this.a)返回'monkey' ,因為this引用了global對象的var / property a (在本例中是相同的) - call-site來自global對象: i_am();
  7. 完成執行 - 但是哦哦! 我們執行了函數並沒有返回值!

現在,根據您的環境,它會隱藏您undefined結果,或者將其打印出來! 為什么? 因為function s希望return一個值。 就像變量聲明一樣,如果你這樣做的話

 var a; console.log(a); 

它沒有被賦值,因此它在undefined RHS之后產生。

類似的原則適用於函數,它正在尋找返回值,但它不會返回任何內容,因此導致undefined


換句話說, 它不是thisreturn小號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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM