JS对象文字,此上下文更改
JS object literal, this context changing
我正在改进我的Javascript结构并试图找出我喜欢的模式,我有以下内容:
var aThing = (function() {
var module;
return {
init: function() {
module = this;
console.log(module);
},
};
})();
当我运行aThing.init();
它记录Object {init: function}
时,这就是我想要的,当我做这样的事情时出现问题:
document.addEventListener('click', aThing.init, false);
这将记录#document
。当我运行没有括号的函数时,似乎this
正在发生变化,我不知道为什么。
这一切都与执行上下文有关。虽然你的 init 方法位于 aThing 模块中,但你在其他地方执行它,所以你对"this"关键字的使用将引用执行上下文。
与其在模块外部编写事件处理程序,不如考虑利用模块来处理它。它可以从模块的 init 方法内部完成,这将为您提供一个更干净的结构,因为您将有关模块的所有内容都存储在模块本身内,而不是在模块外部和内部执行其他操作。
见下文:
var aThing = (function() {
var module;
return {
init: function() {
module = this;
// Handle event binding from somewhere within your module
document.addEventListener('click', module.doSomething, false);
},
doSomething: function () {
console.log('Doing something.');
}
};
})();
// Initialize your module
aThing.init();
您正在获得'document'
引用,因为init()
函数在文档上下文中调用。您可以将函数绑定到您想要的任何对象。
aThing.init.bind(aThing)
或者你可以引用模块,如果它喜欢,
var aThing = (function() {
var module = {
name : 'My module',
init : function() {
alert(module.name);
}
};
return module;
})();
当然,因为事件处理程序中的上下文将document
.使用以下任一用途:
document.addEventListener('click', function() {
aThing.init();
}, false);
或
document.addEventListener('click', aThing.init.bind(aThing), false);
相关文章:
- 如何从HTTP上下文对象中获取Post数据
- 丢失对象“;这个“;方法中的上下文
- 访问函数对象的上下文属性|如何
- 执行上下文和变量对象在 JavaScript 中实际上是一回事吗?
- 对象方法中函数中的上下文
- 在对象文字的声明中继承上下文(this)?“自我”还好吗
- 面向对象的WebGL上下文包装失败
- 执行上下文和Javascript中的执行上下文对象
- 如何根据单击的对象在右键单击时创建多个上下文菜单
- 在 mongo map 中调用外部 javascript 函数(对象)或减少上下文的可能方法
- fabricjs 中对象的上下文菜单
- Java 脚本 eval() 函数属于哪个对象?此外,在调用 eval() 函数时传递执行上下文
- SharePoint - 显示模板 - 访问客户端上下文对象
- 在这种特定情况下,如何在 HTML5 画布上重绘圆?(方法调用与直接使用上下文对象)
- 关于上下文对象的 Javascript 查询
- 迭代器被绑定到上下文对象
- 在Firefox中使用canvas上下文对象调用drawImage()的问题
- 访问其他文件中的Lambda上下文对象
- 当我们将一个方法存储在一个变量中,然后调用它时,为什么上下文对象会变为全局窗口对象
- QML 报告引用错误:XYZ 未在添加到上下文C++对象上定义