javascript - 为什么这个函数可以工作但仍然返回 typeError ... is not a function?

标签 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 明确分配给了一个方法,但它不是一个函数?

最佳答案

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

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

关于javascript - 为什么这个函数可以工作但仍然返回 typeError ... is not a function?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20816366/

相关文章:

java - 实例化和初始化 java.nio.files.Path?

javascript - 构建 ES6 解析器和字符串生成器

javascript - 如何从 div 数组中获取下一个对象?

javascript - 有什么理由不使用加号运算符而不是 Number() 或 parseInt() 来返回数字?

Javascript垃圾收集具有相同变量的新对象

java - DWR的缺点是什么?

oop - 函数是封装的一个例子吗?

java - 存储 "absolute xor incremental"值的设计模式

java - 避免具有不同返回类型的方法的代码重复

javascript - 根据页面内容高度自动扩展侧边框