好的,所以我认为我理解这一点(没有双关语意),但显然不是。
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;
等解决方法。抱歉,如果我没有说清楚。
答案 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
的值取决于您选择的内容:
myFunction()
)。没有给出this
的明确值。 this
的值将是默认对象(浏览器中为window
)。obj.myFunction()
)。 this
的值是调用方法的对象(在这种情况下为obj
)。call
方法(例如myFunction.call(obj)
)。明确提供this
的值(在本例中为obj
)。apply
方法(例如myFunction.apply(obj)
)。明确提供this
的值(在本例中为obj
)。new MyFunction()
)。 this
的值是运行时提供的新创建的对象。这五个中的每一个都在这里详细解释:
答案 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();