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

Javascript 此关键字是构造函数中的窗口对象,javascript,this,Javascript,This,好的,所以我想我理解这一点(没有双关语的意思),但显然不是 var Constructor = function () { var internalFunction = function () { return this === window; }; this.myMethod = function () { alert(internalFunction()); }; }; var myObj = new Constructor()

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

var Constructor = function () {
    var internalFunction = function () {
        return this === window;
    };
    this.myMethod = function () {
        alert(internalFunction());
    };
};
var myObj = new Constructor();
myObj.myMethod();
这会提醒
true
。为什么内部函数不能将此视为对象?相反,我必须使用
alert(internalFunction.call(this))
myMethod


编辑:我在寻找一个解释,解释为什么
这个
是这样分配的,而不是像
var self=this这样的变通方法,等等。如果我没有说清楚,很抱歉。

这是范围问题,请尝试以下方法:

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

由于函数作用域规则,
在每个函数内重新分配。。。我会将您的对象的副本存储为
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
关键字,您将得到
这个
窗口(god)对象,以便在没有警告的情况下将
myMethod
附加到窗口。

在调用函数之前不会绑定,并且取决于调用函数的方式。可以将其视为隐式传递给函数的额外参数

在本例中,问题是您正在使用
internalFunction()
调用
internalFunction
this
值可以通过调用函数作为方法来设置(如
foo.bar()
foo[“bar”]()
),或者通过
call()
apply()
明确设置
this
。您的调用既没有执行,因此
将还原为全局对象

在这种情况下,在保持
internalFunction
私有的同时实现所需功能的最简单方法是在构造函数中存储对
this
的引用:

var Constructor = function() {
    var thisObj = this;

    var internalFunction = function () {
        return thisObj === window;
    };

    thisObj.myMethod = function () {
        alert(internalFunction());
    };
}

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

  • 全局函数调用(例如
    myFunction()
    )。未给出该
  • 的明确值。
    的值将是默认对象(
    浏览器中的窗口
  • 方法调用(例如
    obj.myFunction()
    )。
    this
    的值是调用方法的对象(
    obj
  • 使用
    调用
    方法(例如
    myFunction.call(obj)
    )。明确提供
    this
    的值(在本例中为
    obj
  • 使用
    apply
    方法(例如
    myFunction.apply(obj)
    )。明确提供
    this
    的值(在本例中为
    obj
  • 构造函数(例如
    newmyfunction()
    )。
    的值是运行时提供的新创建的对象
  • 以下将详细介绍这五个方面:


    啊,这很有道理
    这个
    是在调用时分配的,因此通过调用
    internalFunction()
    我隐式调用了
    window.internalFunction()
    。解释得很好。@jondavidjohn:我不打算讨论这个问题,我对原始代码做了不必要的调整,所以我把它还原了。谢谢你指出这一点。这个问题的答案都没有使用
    那个
    。我觉得被出卖了。@missingno:我不喜欢那种
    。这是非描述性的。也就是说,我自己在回答中的选择并没有更好:)+1表示几年后无意中回来的双关语。。。我倾向于使用构造函数的小写版本
    functionnote(){var Note=this;
    我认为这是一个非常容易阅读的约定。