使用'这个'之间的区别是什么?和对象内部的引用对象名称?

时间:2014-08-10 08:01:05

标签: javascript

如果我有以下代码:

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

3 个答案:

答案 0 :(得分:4)

除了前面答案中提到的阴影等之外,使用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

我在这里做的是,我创建的object名字叫John Doe'然后我创建继承自它的anotherObject。现在,在这种情况下,您希望anotherObject.print()打印自己的名称。但它没有。

这是因为您的函数与该特定对象相关联。如果我改为使用this,它会恰当地引用新对象。

另外,想象一下如果我这样做会发生什么。

delete object.name;
anotherObject.print() // Error!

http://jsfiddle.net/uxy08zxz/

这是因为即使你认为它与前一个对象无关,它的功能仍然是指那个属性。不是吗?

因此,请保持通用。使用this。我说保持你的代码更干燥。

答案 1 :(得分:2)

函数内的

this不一定与obj相同。这取决于函数的调用方式。

  • 如果使用obj.init()进行调用,obj将与this相同。
  • 如果使用事件处理程序调用,或类似setTimeout setTimeout(obj.init, 500)this将是浏览器中的全局对象(window,除非您使用严格模式)< / LI>

Good MDN reference on all of this

答案 2 :(得分:1)

我想说这里有两个不同之处:

  1. this可能会被遮蔽。不幸的是,在JavaScript中创建一个匿名函数会将this替换为您所在的新匿名函数,而不是您想要访问的当前对象。
  2. 当您不担心阴影时,如果对象的名称发生变化,this会更灵活。
  3. 在这种情况下,

    this可能更快,因为JavaScript不需要查找引用。