使用侦听器时无法传递“this”
Cannot pass "this" when using listener
我的问题是,当我尝试将函数添加为某个对象的侦听器时,它不尊重创建正在调用的函数this
范围。
现场演示:http://jsfiddle.net/Ht4x9/
如您所见showAct()
将打印"我的活动",但是单击红色<div>
不会。结果是: MyActivity
undefined
如何进行点击<div>
打印?将对象作为函数的参数传递真的有必要吗?我想以尽可能干净的方式做到这一点。
粘贴下面的代码以防万一
谢谢!
.JS
var activity = 'MyActivity';
var Screen = {
act: activity,
_privFunc: function()
{
console.log(this.act);
},
publicFunc: function()
{
$('div').on('click', this._privFunc);
},
showAct: function()
{
this._privFunc();
}
}
Screen.publicFunc();
Screen.showAct();
HTML + CSS
<div>CLICK</div>
div { background: red; width: 100px; height: 100px; cursor: pointer; font-weight: bold
当默认情况下执行事件处理程序时,处理程序内部this
将引用处理程序注册到的 dom 元素。在您的情况下,您需要使用自定义执行上下文来执行回调函数。这可以通过使用 $.proxy() 来完成
jQuery: $.proxy()
$('div').on('click', $.proxy(this._privFunc, this));
下划线:绑定()
$('div').on('click', _.bind(this._privFunc, this));
现代浏览器:绑定()
$('div').on('click', this._privFunc.bind(this));
您只需要使用bind
并将第一个参数设置为this
的预期目标。
正如Arun所建议的那样,如果你有jQuery并且你正在为旧版浏览器提供服务,$.proxy是一个不错的选择。
你为什么不使用类似于以下内容的东西?
var Screen = function () {
var act = activity,
_privFunc = function()
{
console.log(act);
};
this.publicFunc = function()
{
$('div').on('click', _privFunc);
};
this.showAct = function()
{
_privFunc();
}
}
var s = new Screen();
s.publicFunc();
s.showAct();
http://jsfiddle.net/Ht4x9/7/
相关文章:
- Highslide(iframe的侦听器)
- 如何在for循环中添加事件侦听器
- 选项卡侦听器未被来自后台脚本的消息激活
- 未命中服务器发送的事件侦听器
- 如何覆盖原型中的事件侦听器
- 加载侦听器上的函数触发得太早
- 无法将事件侦听器附加到画布
- 如何在d3.js中自定义事件侦听器
- 在es6中,将带有回调的事件侦听器设置为可迭代的
- 事件侦听器未在chrome扩展中的options.js中启动
- IE8更改文本区域上的事件侦听器不工作
- 将事件侦听器添加到文档,而不是签入元素存在,然后添加事件侦听器
- 如何使用.bind(this)删除对象的事件侦听器
- ReactJS:在 JQuery 事件侦听器函数中调用 'this'
- 使用侦听器时无法传递“this”
- 全局范围 - 在触发事件侦听器后访问“this”
- 如何在附加了 .bind(this) 的回调上删除事件侦听器
- “this"当方法绑定到事件侦听器时未定义
- Javascript“this"被事件侦听器覆盖
- 我可以通过'this'作为将事件侦听器注册到local-DOM子节点时的参数