为什么这个函数有效但仍然返回typeError ...不是函数?

时间:2013-12-28 15:51:06

标签: javascript oop

我正在学习js并且对一件事感到困惑。我只是从mdn ...

复制/粘贴代码示例
  function Person(gender) {
    this.gender = gender;
}

Person.prototype.sayGender = function() {
    alert(this.gender);
};

var person1 = new Person('Male');
var genderTeller = person1.sayGender;

person1.sayGender(); // alerts 'Male'
genderTeller(); // alerts undefined
alert(genderTeller === person1.sayGender); // alerts true
alert(genderTeller === Person.prototype.sayGender); // alerts true
上面示例中的

genderTeller将返回undefined,但在第二个示例中略微修改后:

function Person(gender) {
        this.gender = gender;
    }

Person.prototype.sayGender = function() {
        alert(this.gender);
    };

var person1 = new Person('Male');
var genderTeller = person1.sayGender();
genderTeller();

genderTeller函数实际上有效,但也返回'typeError:genderTeller不是函数。'

为什么在明确分配给方法时,genderTeller不是第二个例子中的函数?

2 个答案:

答案 0 :(得分:3)

在第一个示例中,您将函数分配给变量并执行它。在这种情况下this是窗口,因为你只是在调用函数而不是在上调用

在第二种情况下,您正在调用该函数并将其结果分配给genderTeller。由于该函数不返回任何内容,因此该变量未定义。

答案 1 :(得分:0)

看看这一行:

var genderTeller = person1.sayGender();

您正在分配通过调用函数返回的值,因为您正在执行该函数,而不是函数本身。

由于函数实际上没有返回值,因此它不是函数(或者根本不是函数),这就是你得到错误的原因。