该关键字是构造函数中的窗口对象
this keyword is window object within a constructor function
好吧,我以为我明白了(没有双关语的意思),但显然不是。
var Constructor = function () {
var internalFunction = function () {
return this === window;
};
this.myMethod = function () {
alert(internalFunction());
};
};
var myObj = new Constructor();
myObj.myMethod();
警告true
。为什么内部函数不能把this
看作对象?相反,我必须在myMethod
中使用alert(internalFunction.call(this));
。
编辑:我正在寻找一个解释,为什么this
以这种方式分配,而不是变通方法,如var self = this;
等。抱歉我没说清楚
this
在函数被调用之前不被绑定,并且依赖于函数被调用的方式。您可以将其视为隐式传递给函数的额外参数。
在这种情况下,问题是您使用internalFunction()
调用internalFunction
。this
的值可以通过作为方法调用函数来设置(如foo.bar()
或foo["bar"]()
),也可以通过call()
或apply()
显式设置this
。你的调用没有做任何事情,所以this
返回到全局对象。
internalFunction
私有的最简单方法是在构造函数中存储对this
的引用:
var Constructor = function() {
var thisObj = this;
var internalFunction = function () {
return thisObj === window;
};
thisObj.myMethod = function () {
alert(internalFunction());
};
}
由于函数作用域规则,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创建的一个相当不稳定的实践,主要是因为如果您在使用Constructor
时忘记了new
关键字,那么将获得this
引用window
(god)对象,因此您将在没有警告的情况下将myMethod
附加到窗口。
在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
的值是运行时提供的新创建的对象。
在这里更详细地解释了这五个:
- http://devlicio.us/blogs/sergio_pereira/archive/2009/02/09/javascript-5-ways-to-call-a-function.aspx
这是一个范围问题,尝试如下:
var Constructor = function () {
var $this = this;
var internalFunction = function () {
return $this === window;
};
this.myMethod = function () {
alert(internalFunction());
};
};
var myObj = new Constructor();
myObj.myMethod();
相关文章:
- 如何在选项卡上定义属性'的主窗口对象
- 可以从Chrome扩展修改窗口对象吗
- 在Backbone.js中为窗口对象指定变量
- 从html锚元素传递窗口对象
- 如何在ReactJS中使用窗口对象
- 在加载时调用时,窗口对象的某些变量丢失
- 清除 Javascript 中窗口对象中的自定义变量
- 窗口对象属性返回一个dom节点
- 使用窗口对象练习我的对象文字函数
- 如何从Chrome扩展访问所有窗口对象
- Jasmine在全局窗口对象上创建本地JS函数的Spy
- 如何使用Chrome'查看窗口对象中定义了哪些变量;的开发工具
- 有没有一种方法可以强制浏览器's窗口对象以重新评估鼠标所在的位置
- Safari 在尝试使用 Javascript try/catch 访问父窗口对象时未捕获异常
- 测试使用 jQuery 和窗口对象的 React 组件
- 迭代窗口对象时出现“'window.webkitStorageInfo' is deprecated”警
- 窗口对象通过对象类型测试,但 hasOwnProperty 导致错误
- node.js是否等同于浏览器中的窗口对象
- 页面工作线程 - destroy() 似乎没有删除窗口对象
- 全局变量只是“窗口”对象的属性吗?