我正在尝试了解this
关键字在此上下文中的工作原理。
function Person(name) {
this.name = name;
this.sayName = function() {
alert('My name is ' + this.name);
};
}
var p = new Person('Smith');
p.sayName(); // 'My name is Smith'
var q = p;
q.sayName(); // 'My name is Smith'
q = p.sayName;
q(); // 'My name is' ???
为什么最后一个例子没有拿起'史密斯'?
是因为q只是指向一个函数(即在此上下文中无法识别该方法所属的对象)?由于q在全局空间中,this
在函数内是全局的(即sayName()的调用者是全局空间或窗口)?
答案 0 :(得分:2)
这是因为this
指的是调用函数的上下文。当您执行p.sayName()
时,上下文为p
。如果您只调用没有上下文的函数,它将在严格模式下默认为全局上下文(通常为window
)或undefined
。
如果您想让它按照您期望的方式运作,可以bind this
到p
,以便q()
:
q = p.sayName.bind(p);
q(); // My name is Smith
答案 1 :(得分:1)
抄袭@Paulpro所说的内容,您可以通过在类中添加Person()
来创建对var that = this;
上下文的引用。这样你就可以从函数内部调用that.name
。
function Person(name)
{
var that = this;
this.name = name;
this.sayName = function()
{
alert('My name is ' + that.name);
};
}
var p = new Person('Smith');
p.sayName(); // 'My name is Smith'
var q = p;
q.sayName(); // 'My name is Smith'
q = p.sayName;
q(); // 'My name is Smith'
的 View jsFiddle demo 强>