我有一些JS代码,我希望在其子方法中返回我的全局对象的实例(想想流畅的界面):
myGlobalVar = function() {
this.self = this;
this.Whatever = function() {
//return self; // why does that FAIL??
return this.self; // why does that WORK??
}
}
我会假设我return self
但是失败了。 return this.self
成功,但我认为子函数中的this
将引用所述函数。为什么这样做?
答案 0 :(得分:2)
在javascript中,函数中this
的值由函数的调用者决定。
当您致电obj.method()
时,this
的值会在obj
内设置为method()
。因此,在上面的示例中,当您致电myGlobalVar.Whatever()
时,this
内的Whatever()
值将为myGlobalVar
,以便引用sefl
,您使用{ {1}}正如您所发现的那样。
this.self
本身并不起作用,因为它本身不是当前范围内的变量。它是self
的属性,因此在myGlobalVar
时只能被引用为myGlobalVar.self
或this.self
。 Javascript不会自动检查当前对象的属性以解析符号。您只能通过专门引用承载该属性的对象来访问对象的属性,如this === myGlobalVar
中所述。
还有其他方法可以更改this.self
的值。如果在没有this
上下文的情况下调用Whatever()
,例如:
obj
然后,this的值将是常规JS中的全局对象或JS严格模式中的var fn = myGlobalVar.Whatever;
fn();
。
每个函数还有undefined
和.call()
个方法,允许您直接指定要在.apply()
中设置this
值的方法。 }。
答案 1 :(得分:1)
当您尝试访问变量JavaScript时,首先在当前函数范围中查找该变量,然后在随附的函数范围中查找,最后在全局范围内查找。在您的情况下,self
是this
全局对象的成员。当您说this.self
时,如果this
引用全局范围,则this.self
与self
相同。除非您更改当前上下文,this
将引用全局对象,它应该可以工作。请查看以下示例以更好地理解。
myGlobalVar = function() {
this.self = "thefourtheye";
this.Whatever = function() {
console.log(self);
console.log(this.self);
console.log(this.self === self);
}
}
var b = {
self: "thethirdeye"
}
myGlobalVar();
Whatever();
console.log("-------------------");
Whatever.apply(b);
<强>输出强>
thefourtheye
thefourtheye
true
-------------------
thefourtheye
thethirdeye
false
当我第二次调用Whatever
时,我正在使用apply将当前上下文设置为对象b
。所以,现在this
指向b
。现在,self
与this.self
不同。当我引用self
时,它会查找层次结构并在全局范围内找到self
,它会打印thefourtheye
,当我说this.self
时,它会查找self
在b
中,它会打印thethirdeye
。希望现在明白。