在制作对象时我假设this
会返回对象的实例 - 而不是它似乎是其他东西。这是为什么?
var Obj = {
foo : 'value',
bar : function() { return this.foo; } // Error
bar : function() { return Obj.foo; } // Works
}
更新:我必须遗漏某些内容,因为在某些情况下,在对象内部使用this
不起作用。为什么这只引用了对象实例有时?
答案 0 :(得分:2)
确实如此。您有语法问题。
使用逗号分隔对象成员
var Obj = {
foo : 'value',
bar : function() { return this.foo; },
}
成员函数this
中的指的是对函数调用的对象的引用。
答案 1 :(得分:2)
在JavaScript函数中this
的设置取决于函数的调用方式。
使用示例Obj
,假设您更正了语法错误并在属性之间使用逗号:
var Obj = {
foo : 'value', // needs comma, not semicolon
bar : function() { return this.foo; }
}
如果您使用Obj
上的“点”语法来调用bar
函数,则this
将自动设置为Obj
:
Obj.bar(); // this will be Obj
这是确保this
最终设置您想要的方式的简单方法。但是,如果您以某种其他方式调用该函数,this
可以设置为其他内容:
var nonObjBar = Obj.bar; // get a reference to the function
nonObjBar(); // this will (probably) be `window`, but depends if
// in strict mode or inside some other function, etc
var Obj2 = { foo: "other foo" };
Obj.bar.call(Obj2); // the .call() method sets this to Obj2
// so bar will return Obj2's foo, "other foo"
最后一个示例使用.call()
上的Obj.bar
方法以允许您将this
设置为您喜欢的任何方式来调用该函数(严格模式与非严格模式会影响这适用于某些情况)。
如果你来自像Java这样的语言,那似乎很奇怪,但JavaScript函数不属于任何给定的对象。这个行为很有意义且有目的。
答案 2 :(得分:1)
在“值”之后修复分号后,这似乎有效:
var Obj = {
foo : 'value',
bar : function() { return this.foo; } // Error
};
alert(Obj.bar()); // alerts 'value'
请在此处查看jsFiddle:http://jsfiddle.net/jfriend00/UFPFf/。
当您在对象上调用方法时,javascript引擎会将this
指针设置为在方法调用期间指向该对象。
答案 3 :(得分:0)
foo
之后你不应该有分号。
实际上,当您致电Obj.bar
时, 会 指代Obj
。
var Obj = {
foo : 'value',
bar : function () { return this.foo; }
};
alert(Obj.bar() === Obj.foo);
警告为真。