使用'this'以及在对象内部引用的对象名称
Whats the difference between using 'this' and the object name for reference inside the object?
如果我有以下代码:
var obj = {
x: 34,
init: function() {
alert(this.x);
alert(obj.x)
}
};
两个警报都显示34。但是两者有什么区别,一个比另一个好吗?
http://jsfiddle.net/4scz435q/我在jsperf中做了一个测试,看起来this
更快一些,但我仍然不明白两个版本的内部工作原理。http://jsperf.com/name-vs-this-in-obj
除了前面的答案中提到的阴影等,使用this
更通用,因此在某些场景中会更有效地工作。让我举例说明。
var object = {
name: 'John Doe',
print: function () {
console.log(object.name);
}
};
var anotherObject = Object.create(object);
object.print(); // John Doe
anotherObject.print(); // John Doe
anotherObject.name = 'Jane Doe';
console.log(anotherObject.name); // Jane Doe
anotherObject.print(); // John Doe
我在这里所做的是,我创建了一个名称为"John Doe"的object
,然后我创建了从它继承的anotherObject
。现在在这个场景中,您希望anotherObject.print()
打印自己的名称。但它没有。
这是因为您的函数绑定到特定对象。如果我使用this
,它就会正确地引用新对象。
同样,想象一下如果我这样做会发生什么。
delete object.name;
anotherObject.print() // Error!
http://jsfiddle.net/uxy08zxz/这是因为即使你认为它与前一个对象无关,它的函数仍然指向那个属性。不是吗?
因此,保持它的泛型。使用this
。
函数内的this
不一定与obj
相同。这取决于如何调用函数。
- 如果使用
obj.init()
调用,obj
将与this
相同。 - 如果使用事件处理程序调用,或setTimeout
setTimeout(obj.init, 500)
,this
将是全局对象(window
在浏览器中,除非你使用严格模式)
很好的MDN参考
我想说这里有两个不同:
-
this
可以被阴影。不幸的是,在JavaScript中创建匿名函数可能会将this
替换为对新匿名函数的引用,而不是您想要访问的当前对象。 - 当你不担心阴影,
this
是更灵活的,如果对象的名称改变。
this
在这种情况下可能更快,因为JavaScript不需要查找引用
相关文章:
- 如何使用object.assign()从其他对象引用基本对象属性
- 返回 JavaScript 类值而不是对象引用
- Facebook:当发布期望对象引用时显示打开的图形对话框
- Javascript-如何从字符串/对象引用回调
- 将其用于对象引用
- 如何将对象引用传递到 mootools 中另一个对象的构造函数中
- Javascript:将类/对象引用设置为 NULL,内存中的子对象/类会发生什么
- 在 Jquery 中,我可以存储对象引用并在以后使用它吗?
- 将对象函数传递给请求动画帧时丢失对象引用
- JavaScript ecma6中的对象引用
- 在JSON中存储对象引用
- 为什么可以在内部函数成员中访问对象引用,而不能在内部属性成员中访问
- 对象引用的隐式传递是如何工作的
- 按对象的 ID 删除对选定对象的对象引用
- 在调用的函数中使用对象引用(this)
- 如何在testcomplete+js中获取对象引用
- 在Angularjs服务中为返回对象引用的http请求提供的数据构建简单的缓存
- JavaScript对象引用
- 对象引用未设置为行中的对象的实例,如果 (!string.IsNullOrEmpty(tdcd.文本)&&
- 如何在使用声明式 Dojo 时获取对象引用