为什么这会返回undefined -javascript

时间:2011-10-13 04:57:52

标签: 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岁 年龄如下未定义

6 个答案:

答案 0 :(得分:8)

因为你没有退货。

答案 1 :(得分:2)

你必须在功能上轻松回归

以下应该工作

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());

答案 2 :(得分:2)

没有人提到它所以我会 - 在构造函数的原型上放置对所有实例都相同的函数会更有效。然后,您只有一个所有实例使用的函数实例,例如

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;
}

答案 3 :(得分:0)

如果你想从被调用函数中获取一些值,你必须使用

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());

将按预期工作。

答案 4 :(得分:0)

如前所述,您未在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 = ...,您正在创建一个每个Person实例的新函数。

答案 5 :(得分:0)

  

@Davenewton的答案是正确的,尽管我喜欢它的答案   坦率地说,需要这样
   著名的 a-ha!时刻让您充分   知道为什么。这是真正发生的事情:

所以要详细说明 如果我们有这样的事情:

function i_am(){
  var a = 'very smart person';
  console.log(this.a);
}

var a = 'monkey';
i_am();

根据您可能使用的林特或浏览器,它可能会返回

> "monkey" // (try the snippet)

或者也是

> "monkey"  
> undefined    // check the sreenshot

enter image description here

这是由于一个简单的原因,如果我们逐步了解编译器如何“读取”代码,则最好理解。

  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引用了var对象的property a / global(在这种情况下是相同的)-呼叫站点来自global对象:i_am();
  7. 完成执行-但是,哦! 我们执行了函数,但未返回任何值!

现在,根据您的环境,它可以隐藏undefined的结果,也可以将其打印出来!为什么?因为function都在寻找return的值。就像变量声明一样,如果您这样做

var a;
console.log(a);

尚未为其分配值,因此在undefined中的RHS之后产生。

类似的原理适用于要返回值但不返回任何值的函数,因此导致undefined


换句话说,不是this return的{​​{1}}。是undefined的调用返回了i_am();

希望大家现在都清楚了:)