两个代码段之间有区别吗?
由于foo
是obj
的成员函数,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 时,它有效。
任何想法为什么?
答案 0 :(得分:1)
由于obj
和this
的分辨率推迟到执行函数之前,其结果可能会有所不同,具体取决于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";
请注意,您可以使用this
或call()
设置apply()
的值来规范化此行为,如评论中所述:
anotherObject.objAFoo.call(objA); // "test";
但是,请注意,使用bind()
或jQuery.proxy()
绑定this
的情况可能会对您造成伤害。