Javascript this关键字和变量指向一个对象方法
Javascript this keyword and variables pointing to an object method
我想了解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' ???
为什么最后一个例子没有提到'Smith'?
是否因为q只是指向一个函数(即该方法所属的对象在此上下文中不被识别)?因为q是在全局空间,this
是全局的函数内(即sayName()的调用者是全局空间或窗口)?
这是因为this
引用了调用函数的上下文。当您执行p.sayName()
时,上下文是p
。如果你只是调用一个没有上下文的函数,它将默认为全局上下文(通常是window
)或严格模式下的undefined
。
如果你想让它按照你期望的方式工作,你可以将this
绑定到p
,这样q()
:
q = p.sayName.bind(p);
q(); // My name is Smith
借助@Paulpro所说的,您可以通过在类中添加var that = this;
来创建对Person()
上下文的引用。这样就可以从函数内部调用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演示/em>
相关文章:
- 从 javascript 中的对象方法返回一个对象
- 通过引用Javascript中的另一个函数来传递对象方法
- 什么'是从对象列表中一次编辑一个对象的正确Angular/Firebase方法
- 有没有一种方法可以创建一个对象并同时为其指定一个动态特性
- 从一个对象中找出所有方法
- 将此(对象)传递到一个对象方法嵌套方法中
- 用javascript在一个对象的两个键上声明两个数组的简洁方法是什么
- javascript对象方法可以是一个操作吗
- 猫鼬对象方法不是一个函数
- Javascript:如何在不复制但链接的情况下将另一个对象 B 的方法混合到我的对象 A
- 将第一个(对象的)数组的属性复制到不同长度的另一个(对象)数组的Javascript方法
- 如何测试 javascript 方法是否创建一个对象并调用该对象上的方法
- Jquery:扩展一个对象来修改一个方法
- Jquery:一个jquery对象(方法链)上可以调用的函数数量是否有限制
- 从JSON创建一个对象,并在Javascript中给它一些方法
- JavaScript - 尝试从另一个对象内部访问一个对象方法,得到未定义的错误
- 在Javascript中声明一个对象上的方法时,如何正确引用该对象上的一个方法集
- Javascript this关键字和变量指向一个对象方法
- 如何在另一个对象方法中引用对象方法
- 在木偶视图中,我最好发布事件或调用另一个对象方法