为什么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
答案 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);
上下文一起使用。在此之前,您需要依靠实现为您选择上下文。
(例如,您的原始代码作为摘要运行时有效,但在浏览器上下文中则无效。)