javascript - 为什么在调用对对象方法的引用时方法的 `this` 会发生变化?

标签 javascript

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

为什么 genderTeller();警报未定义我不清楚。如果我看到它,我相信它和上面的线一样。能否请一些人解释一下细节

最佳答案

当你像这样分配一个变量时......

var genderTeller = person1.sayGender;

...您丢失了 person1 对象的 context,函数的 this 指向全局对象 (window 在浏览器中),而不是实例化的 person1 对象。

您得到 undefined 因为 gender 属性在 window 上不存在,并且在对象上引用 undefined 属性返回 undefined 在 JavaScript 中。

您可以在现代浏览器中使用 bind() 修复该问题...

var genderTeller = person1.sayGender.bind(person1);

...或者 jQuery 有一个方法也叫做 proxy() .

var genderTeller = $.proxy(person1.sayGender, person1);

关于javascript - 为什么在调用对对象方法的引用时方法的 `this` 会发生变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7657633/

相关文章:

javascript - 不渲染砌体布局

javascript - jQuery 正常提交表单或使用 Font Awesome 按钮根据变量使用 Ajax 提交表单

javascript - Laravel - 如果为空 AJAX jQuery,则复选框过滤器

javascript - 为什么这个内部函数返回未定义?

javascript - ImmutableJS - 更新矩阵的单元格

javascript - Safari 中的无效日期

javascript - 如何有条件地使用带有 ES6 样式导入的内置 Node.js 或浏览器 API 方法?

javascript - Chrome 在 anchor 标记中创建页面内链接的问题

javascript - 使用函数构造函数的原型(prototype)继承

javascript - 数组重新循环以删除先前生成的一组数组数据