Javascript这个关键字和指向对象方法的变量

时间:2013-06-12 19:51:19

标签: javascript

我正在尝试了解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()的调用者是全局空间或窗口)?

2 个答案:

答案 0 :(得分:2)

这是因为this指的是调用函数的上下文。当您执行p.sayName()时,上下文为p。如果您只调用没有上下文的函数,它将在严格模式下默认为全局上下文(通常为window)或undefined

如果您想让它按照您期望的方式运作,可以bind thisp,以便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