1

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

4

2 回答 2

2

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

如果你想让它以你期望的方式工作,你可以绑定 thisp,这样q()

q = p.sayName.bind(p);

q(); // My name is Smith
于 2013-06-12T19:59:15.370 回答
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'


查看 jsFiddle 演示

于 2013-06-12T20:06:10.230 回答