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;
我认为这是一个非常容易阅读的约定。