“this”和对象名称之间的区别

时间:2013-01-09 10:35:55

标签: javascript this

两个代码段之间有区别吗?

由于fooobj的成员函数,this会引用obj本身(方法调用模式)。

1

var obj = {};
obj.prop = some_property;
obj.foo = function() {
  do_something_with(obj.prop);
};

2

var obj = {};
obj.prop = some_property;
obj.foo = function() {
  do_something_with(this.prop);
};

我正在处理的应用程序,当我使用 2 时,它一直崩溃。

代码如下:

obj = {};
obj.listener = {
  eventprocess : function(param) {
    //some code
  }
};
obj.init = function() {
  this.a = library_func();
  this.a.add_listener(this.listener);
};

当我使用 1 时,它有效。

任何想法为什么?

1 个答案:

答案 0 :(得分:1)

由于objthis的分辨率推迟到执行函数之前,其结果可能会有所不同,具体取决于this或/和obj在定义之间是否发生了变化和调用。

例如,给定两个相同的对象,除了一个使用this而另一个使用函数obj中的foo

var objA = {};
objA.prop = "test";
objA.foo = function() {
  alert(this.prop);
};

var objB = {};
objB.prop = "test";
objB.foo = function() {
  alert(objB.prop);
};

......我们会在这里看到不同的行为:

var anotherObject = {
  objAFoo: objA.foo,
  objBFoo: objB.foo
};

anotherObject.objAFoo(); // "undefined";
anotherObject.objBFoo(); // "test";

http://jsfiddle.net/3D6xY/

请注意,您可以使用thiscall()设置apply()的值来规范化此行为,如评论中所述:

anotherObject.objAFoo.call(objA); // "test";

http://jsfiddle.net/3D6xY/1/

但是,请注意,使用bind()jQuery.proxy()绑定this的情况可能会对您造成伤害。