1

2个代码片段之间有区别吗?

由于foo是 的成员函数objthis因此将引用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时它起作用了。

任何想法为什么?

4

1 回答 1

2

由于objand的解析this被推迟到函数的执行,它的结果可能会根据定义和调用之间的thisor/and是否发生变化而有所不同。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/

请注意,您可以通过设置thisusing call()or的值来规范此行为apply(),如注释中所指出的:

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

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

但是,还请注意,在此处this已绑定使用bind()jQuery.proxy()可能会伤害您的情况。

于 2013-01-09T11:44:00.620 回答