如果我按如下方式创建一个Object:
window.Something = {
X: function() {
// statements...
}
};
在不使用this
的情况下访问此对象的最佳方法是什么?
示例:
如果我使用以下方式调用X
属性:
window.addEventListener("DOMContentLoaded", window.Something.X);
在这种情况下,使用this
将访问窗口,而不是Something
。
我想过这种方法,但我认为这是一种不好的做法。
window.Something = {
X: function() {
var This = window.Something;
// statements...
}
};
有一种隐式方法可以始终访问创建属性的real
对象吗?
答案 0 :(得分:2)
如果我正确理解您的问题,那么您可能想要使用bind
:
https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_objects/Function/bind
做这样的事情:
window.addEventListener("DOMContentLoaded", Something.X.bind(Something));
这将确保在Something.X
的通话中,this
指向Something
。
更有用的信息:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/this
答案 1 :(得分:2)
使用bind()
使用相应的this
:
window.addEventListener("DOMContentLoaded", window.Something.X.bind(window.Something));
答案 2 :(得分:2)
没有人指出 为什么 正在发生这种情况。
根据MDN:
使用
addEventListener()
将处理函数附加到元素时,处理程序中this
的值是对元素的引用。它与传递给处理程序的事件参数的currentTarget
属性的值相同。
换句话说,this
引用window
对象,因为事件侦听器附加到window
对象。例如,如果您将事件监听器附加到input
元素,则this.name
将引用该事件所附加的name
元素的input
属性。
window.Something = {
name: 'Some name',
X: function() {
console.log(this.name); // 'test'
}
};
document.getElementById('target').addEventListener('input', Something.X);

<input id="target" name="test" />
&#13;
正如其他人所指出的那样,您可以使用bind()
method更改this
的值:
window.Something = {
name: 'Some name',
X: function () {
console.log(this.name); // 'Some name'
}
};
window.addEventListener("DOMContentLoaded", Something.X.bind(Something));
&#13;
或者,您也可以在匿名函数中执行X
方法。这会阻止addEventListener()
方法修改this
的值。
window.Something = {
name: 'Some name',
X: function () {
console.log(this.name); // 'Some name'
}
};
window.addEventListener("DOMContentLoaded", function () {
Something.X();
});
&#13;
答案 3 :(得分:0)
不需要引用窗口(当您在全局范围内声明变量时,窗口始终是对象),您也可以使用bind()或包装器函数。这将引用范围中的第一个对象。请尝试以下代码
Something = {
X: function()
{
// statements...
console.log(this);
}
};
window.addEventListener('click',function(){Something.X()});