Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/467.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 区别于;这";和对象名_Javascript_This - Fatal编程技术网

Javascript 区别于;这";和对象名

Javascript 区别于;这";和对象名,javascript,this,Javascript,This,这两段代码之间有区别吗 由于foo是obj的成员函数,这个将引用obj本身(方法调用模式) 1. var obj = {}; obj.prop = some_property; obj.foo = function() { do_something_with(obj.prop); }; var obj = {}; obj.prop = some_property; obj.foo = function() { do_something_with(this.prop); }; 2. v

这两段代码之间有区别吗

由于
foo
obj
的成员函数,
这个
将引用
obj
本身(方法调用模式)

1.

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

var obj = {};
obj.prop = some_property;
obj.foo = function() {
  do_something_with(obj.prop);
};
var obj = {};
obj.prop = some_property;
obj.foo = function() {
  do_something_with(this.prop);
};
我正在开发的一个应用程序在使用approach2时不断崩溃

代码类似于:

obj = {};
obj.listener = {
  eventprocess : function(param) {
    //some code
  }
};
obj.init = function() {
  this.a = library_func();
  this.a.add_listener(this.listener);
};
当我使用方法1时,它起作用


有什么想法吗?

由于
obj
的解析延迟到函数执行时,其结果可能会因
或/和
obj
在定义和调用之间是否已更改而有所不同

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

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";

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

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


但是,也要注意,
已使用绑定或可能会伤害您的情况。

由于
obj
的解析延迟到函数执行时,其结果可能会有所不同,这取决于
obj
在定义和调用之间是否发生了更改。例如,当使用
this
时,执行
var bar=obj.foo;bar.foo()
,将中断
this
引用,但保留
obj
。我建议您阅读一些关于“this”关键字的教程。下面是一个很好的例子。您是否已经在某处声明了属性
obj.b
?你的代码不清楚。。。但是如果您没有,并且您也没有声明
obj.b
add\u listener
属性,那么这将导致错误。@guypursey,对不起,这是一个输入错误。它应该是
a
。“编辑。@马特,你能写下来作为回答吗?我忽略了这样一个事实,即
的解析延迟到执行。还值得一提的是,您可以使用
调用
方法使
objAFoo()
工作(即显示
objA.prop
的值,而不是
未定义的
)。方法
call
允许
更改此
,如下所示:
另一个对象.objAFoo.call(objA);//“测试”(没有双关语)。@guypursey:谢谢,我已经把它纳入了我的答案中。