这个JavaScript函数如何工作?

时间:2013-09-29 05:52:40

标签: javascript html

我是javascript的全新手。 在下面的模板和JS函数中,我试图显示person1名称和person2名称并显示它们是否相等。

<!DOCTYPE html>
<html>
<head>
<script>
function Person(name, age, job){
    this.name = name;
    this.age = age;
    this.job = job;
    this.sayName = function(){
        alert("in function" + this.name);
    };
}
var person1 = new Person("Nicholas", 29, "Software Engineer");
var person2 = new Person("Greg", 27, "Doctor");
alert(person1.sayName());
alert(person2.sayName());
alert(person1.sayName() == person2.sayName() );
</script>
</head>
<body>
<div>

</div>
</body>
</html> 

但我一个接一个地收到这些警告。

in functionNicholas

undefined

in functionGreg

undefined

in functionNicholas

in functionGreg

true

请帮我控制流程。 如果问题太愚蠢和基本,请原谅我。 感谢

我不知道为什么我会两次收到未定义的警报。

6 个答案:

答案 0 :(得分:4)

它提醒undefined因为,alert不会返回任何内容,或者您​​的功能person1.sayName()不会返回任何内容,只会发出警报。

根据您的命名约定sayName是正确的,因为它通过警报,打印,显示或类似方式完成其工作,但不必返回任何内容,并且它不会返回任何内容。因此person1.sayName() == person2.sayName()是真的undefined == undefined

答案 1 :(得分:2)

当你这样做时:

alert(person1.sayName());

发生以下情况:

  1. 它会调用person1.sayName()
  2. 这会调用alert('in function' + this.name);,这会导致in functionNicholas收到警报。
  3. sayName函数返回。由于没有return somevalue语句,因此返回undefined
  4. 现在,您使用返回的值调用alert,这就像alert(undefined),这就是您看到undefined已发出警报的原因。
  5. 你做什么:

    alert(person1.sayName() == person2.sayName());
    

    它会调用每个人的sayName方法,该方法会提醒他们的姓名。他们每个都返回undefined,所以你这样做:

    alert (undefined == undefined);
    

    由于它们相同,因此会发出警告true

答案 2 :(得分:1)

您应该使用:

    function Person(name, age, job){
    this.name = name;
    this.age = age;
    this.job = job;
    this.sayName = function(){
        alert("in function" + this.name);
    };
}
var person1 = new Person("Nicholas", 29, "Software Engineer");
var person2 = new Person("Greg", 27, "Doctor");
person1.sayName();
person2.sayName();

答案 3 :(得分:0)

sayName()函数不返回任何值,默认返回值是未定义的,所以你实际在做的是将一个undefined与另一个undefined进行比较

var x = person1.sayName()

// x is undefined

你可以改变 sayName()以在警报后返回当前名称:

this.sayName = function(){
    alert("in function" + this.name);
    return this.name;
};

答案 4 :(得分:0)

每次运行sayName()函数时,都会在函数中创建一个警报,然后返回undefined。总是在JavaScript中返回一些内容,如果没有指定任何内容,那么它是未定义的。

你首先为尼古拉斯打印sayName,提醒他的名字,然后返回undefined。然后,您会提醒返回的值(未定义)。

重复Greg。

最后一行比较两者,它们首先警告它们的两个名称,然后比较两个返回的函数(换句话说,undefined == undefined,这是TRUE)。然后提醒True。

答案 5 :(得分:0)

其他答案都是正确的。此外,为了进行比较,在您的上次提醒中,我想您想检查这些人的姓名是否相同。

alert(person1.name === person2.name);

为此,您可以使用上面的“点语法”访问每个对象的name属性。 ===(三重等于)运算符是此语言中比较的最佳运算符。您应该更喜欢标准[不可靠] ==