方法执行javascript

时间:2018-12-14 03:57:49

标签: javascript

为什么this.name在这里不起作用?如何解决?

var john = {
  name: 'John',
  greet: function(person) {
    alert("Hi " + person + ", my name is " + this.name);
  }
};
var fx = john.greet;
fx("Mark"); //Hi Mark, my name is

2 个答案:

答案 0 :(得分:3)

在这种情况下,

this引用JavaScript window对象,因为您实际上是在重新定义函数名称。直接调用john.greet ("Mark")是可行的,因为this将指向调用该方法的对象。

根据您的情况,您可以使用对象名称来引用其属性。

请参阅此帖子以供参考: How does the "this" keyword in Javascript act within an object literal?

另一种可能的解决方案是更改函数本身的上下文,这可以使用Function.prototype.bind()方法来完成。有关详细信息,请参阅@Markus Stefanko的答案。

var john = {
  name: 'John',
  greet: function(person) {
    alert("Hi " + person + ", my name is " + john.name);
  }
};
var fx = john.greet;
fx("Mark"); //Hi Mark, my name is

答案 1 :(得分:1)

您可以这样绑定this的{​​{1}}上下文来解决此问题:

fx

通过这种方式,您明确声明fx将与john作为var fx = john.greet.bind(john); 上下文一起使用。在此之前,您需要依靠实现为您选择上下文。

(例如,您的原始代码作为摘要运行时有效,但在浏览器上下文中则无效。)