this.variable与变量子范围

时间:2014-01-22 02:57:59

标签: javascript closures

我有一些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将引用所述函数。为什么这样做?

2 个答案:

答案 0 :(得分:2)

在javascript中,函数中this的值由函数的调用者决定。

当您致电obj.method()时,this的值会在obj内设置为method()。因此,在上面的示例中,当您致电myGlobalVar.Whatever()时,this内的Whatever()值将为myGlobalVar,以便引用sefl,您使用{ {1}}正如您所发现的那样。

this.self本身并不起作用,因为它本身不是当前范围内的变量。它是self的属性,因此在myGlobalVar时只能被引用为myGlobalVar.selfthis.self。 Javascript不会自动检查当前对象的属性以解析符号。您只能通过专门引用承载该属性的对象来访问对象的属性,如this === myGlobalVar中所述。


还有其他方法可以更改this.self的值。如果在没有this上下文的情况下调用Whatever(),例如:

obj

然后,this的值将是常规JS中的全局对象或JS严格模式中的var fn = myGlobalVar.Whatever; fn();


每个函数还有undefined.call()个方法,允许您直接指定要在.apply()中设置this值的方法。 }。

答案 1 :(得分:1)

当您尝试访问变量JavaScript时,首先在当前函数范围中查找该变量,然后在随附的函数范围中查找,最后在全局范围内查找。在您的情况下,selfthis全局对象的成员。当您说this.self时,如果this引用全局范围,则this.selfself相同。除非您更改当前上下文,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。现在,selfthis.self不同。当我引用self时,它会查找层次结构并在全局范围内找到self,它会打印thefourtheye,当我说this.self时,它会查找selfb中,它会打印thethirdeye。希望现在明白。