成员函数中的Javascript“this”object==“window”
Javascript `this` object == `window` in member function
在我的一些Javascript对象中,我发现我的this
指针在创建时是正确的-这些是new Func()
类型的对象,但在指定的方法中可能是错误的。
function Confused() {
console.log("checking",this==window,"is always false");
this.method = function() {
console.log("checking",this==window,"is true for some funcs but not others");
};
};
在一些对(new Confused()).method()
的调用中,它似乎丢失了this
指针。这种情况发生的时间似乎取决于函数,而不是随机的;代码中关于我如何创建类的内容导致了这种情况。
示例在线http://williame.github.com/barebones.js/并且成员回调CCD_ 5有时在被调用时具有错误的CCD_。
为什么,以及如何修复?
在Javascript中有4种方法可以使用函数每一个都改变了this
的内容:
- 函数调用:this=全局对象(浏览器中的窗口)
- 方法调用:this=从中调用它的对象
- 构造函数调用:this=您正在创建的新对象
- call/applycalls:this=您传递的对象
在您的情况下,当您直接调用函数(Confused()
)时为this == window
,但如果您使用new(new Confused()
)进行调用,则它将是您正在创建的新对象。
this
关键字指的是调用上下文。它从来都不是错误的,但它可能不是你所期望的。
如果使用.call
或.apply
调用函数,则可以在调用函数时手动设置上下文。
此外,如果您想要引用window
,为什么不使用window
而不是this
呢?这是访问窗口对象的一种更可靠的方法。
除了David Hedlunds的解释之外,您还可以像这样"解决"这个问题:
function Confused() {
var that = this;
console.log("checking",that==window,"is always false");
this.method = function() {
console.log("checking",that==window,"is always false");
};
};
问题是,实际调用函数的人可以控制函数的上下文。如果你不能控制函数调用(也就是说,如果你不能修改代码),那么你就只能使用我给出的解决方案(至少我不知道其他方法)。
虽然这个解决方案看起来有点"黑客",但如果你仔细想想,它真的不是。它只是利用闭包赋予你的力量:D
相关文章:
- 函数未在Object.keys或Object.getOwnPropertyNames下列出,但可以调用
- 如何取消object.prototypes javascript的一个函数
- 具有子类的构造函数中的Object.freeze
- Object.assign(),函数方法和内存使用
- 使用元素选择器向Object添加函数
- 成员函数中的Javascript“this”object==“window”
- 这在 Object 方法中不引用对象,而是引用函数绑定到的标记
- 有人可以解释一下Object.defineProperty如何在javascript的构造函数中工作
- 运行咕噜咕噜咕噜抛出 _.object 不是函数错误
- 从Object Literal调用函数
- 将函数参数传递给Object.assign
- 不涉及私有“函数”的“Object.create”的自定义实现
- 在NodeJS中传递回调函数变成Object
- Underscore.js:具有_.object函数的意外行为
- Javascript错误Object函数没有方法'url'
- Array.insert函数错误,因为Object函数Array(){〔本机代码〕}没有方法'插入'
- Object函数在Javascript中与“;新的“;关键字
- 将Object函数传递到d3中的data()中
- 如何在数组中存储Object's函数指针?
- 在object literal中使用object's函数