此关键字是构造函数中的窗口对象

时间:2011-11-02 14:34:03

标签: javascript this

好的,所以我认为我理解这一点(没有双关语意),但显然不是。

var Constructor = function () {
    var internalFunction = function () {
        return this === window;
    };
    this.myMethod = function () {
        alert(internalFunction());
    };
};
var myObj = new Constructor();
myObj.myMethod();

此警告true。为什么内部函数不能将this视为对象?相反,我必须在alert(internalFunction.call(this));中使用myMethod

修改:我一直在寻找解释为什么this以这种方式分配的解释,而不是var self = this;等解决方法。抱歉,如果我没有说清楚。

4 个答案:

答案 0 :(得分:6)

this在调用函数之前不受约束,并且取决于函数的调用方式。您可以将其视为隐式传递给函数的额外参数。

在这种情况下,问题是您使用internalFunction致电internalFunction()this值可以通过调用函数作为方法(如foo.bar()foo["bar"]())或通过this或{{明确地设置call()来设置1}}。你的电话都没有,所以apply()恢复到全局对象。

在保持this私有的同时实现所需内容的最简单方法是在构造函数中存储对internalFunction的引用:

this

答案 1 :(得分:3)

由于功能范围规则,this会在每个函数中重新分配...我会将您的对象副本存储为self并相应地使用它...

var Constructor = function () {

    var self = this;

    var internalFunction = function () {
        return self === window;
    };
    this.myMethod = function () {
        alert(internalFunction());
    };
};
var myObj = new Constructor();
myObj.myMethod();

应该为您提供您期望的输出。

旁注

这是javascript创建的一种相当不稳定的做法,主要是因为如果您在使用new时忘记Constructor关键字,获取this引用到window(上帝)对象,这样你就可以在没有警告的情况下将myMethod附加到窗口。

答案 2 :(得分:2)

在JavaScript中调用函数有五种方法。 this的值取决于您选择的内容:

  1. 全局函数调用(例如myFunction())。没有给出this的明确值。 this的值将是默认对象(浏览器中为window)。
  2. 方法调用(例如obj.myFunction())。 this的值是调用方法的对象(在这种情况下为obj)。
  3. 使用call方法(例如myFunction.call(obj))。明确提供this的值(在本例中为obj)。
  4. 使用apply方法(例如myFunction.apply(obj))。明确提供this的值(在本例中为obj)。
  5. 构造函数(例如new MyFunction())。 this的值是运行时提供的新创建的对象。
  6. 这五个中的每一个都在这里详细解释:

答案 3 :(得分:1)

它的范围问题尝试类似:

var Constructor = function () {
    var $this = this;
    var internalFunction = function () {
        return $this === window;
    };
    this.myMethod = function () {
        alert(internalFunction());
    };
};
var myObj = new Constructor();
myObj.myMethod();