为什么将函数引用封装到匿名函数中可以更正'这'指向
Why wrap a function reference into an anonymous function can correct 'this' point to?
为什么将函数引用封装到匿名函数中可以更正"this"点?
var logger = {
x: 0,
updateCount: function () {
this.x++;
console.log( this.x );
console.log( "Now I'm pointing to : " + this );
}
}
当我像这样打时
btn.addEventListener('click', logger.updateCount );
// may work like below
function cb() {
console.log(this);
}
addEventListener('click', cb) {
// this --> DOM element
cb(); //=> console.log(this) --> DOM element
}
但是,当我将logger.updateCount
封装在匿名函数中时,是否可以更正"this"?
btn.addEventListener('click', function (e) {
logger.updateCount(); //=> this -- point to 'logger' object
});
为什么?
想象一下btn.addEventListener
内部的样子,可能是:
function addEventListener( eventString, callback ) {
// check the event
// if all is good
// set up an event object
// call back
callback(eventObject);
}
从中可以看出,addEventListener
只知道有一个回调函数,但不知道它的this
是否应该是一个特定的对象。
JS的工作方式是,如果只是假设它在点之前找到了一些对象(就像第二个例子logger.updateCount()
中一样),它就会将其用作this
,但如果它没有。。。然后你需要将其bind
转换为一个,比如:
btn.addEventListener('click', logger.updateCount.bind(logger) );
(this)是根据调用站点(函数的调用方式)解析的。
如果函数是作为一个方法调用的,也就是说,如果它像.func()一样使用,那么它将按如下方式传递。logger.updateCount()是在事件侦听器中调用的,而不是从哪里调用它。updateCount方法将始终接收logger对象。这是硬绑定到记录器对象的。
如果函数对象是作为事件处理程序或回调传递的。this绑定到触发事件的DOM元素。
函数接收的this上下文可以通过使用bind方法进行更改,如下所示:logger.updateCount.bind()在上面的情况下,updateCount将始终接收您作为参数发送的targetObject作为此上下文
相关文章:
- 指向函数的链接
- 为什么实例构造函数指向最上面的函数构造函数对象
- 为什么将函数引用封装到匿名函数中可以更正'这'指向
- 如何使对象的函数或属性成为指向另一个对象函数的指针
- 如何在php程序中的jQuery/Ajax函数中指向正确的表行
- 使用指向javascript中函数的指针
- 在javascript中,在函数名被指向其他地方之后,是否有任何方法可以访问该未命名的函数
- 为什么函数中改变的对象会改变它们在内存中指向的内容,但有时会创建一个新的内存对象
- 指向函数的Javascript指针
- 如何在<tr>当点击<td>指向javascript函数
- Ext.data.JsonP.request总是指向失败的函数
- 在Javascript中,为什么constructor属性指向原型链中最基本的构造函数?
- 为什么下面的'构造函数'指向Object
- 我有一个嵌套if的函数.我怎样才能做出'这个'指向构造函数.父
- 如何构造原型,使函数上下文不指向“原型”对象?
- JavaScript语法疯狂:指向eval函数的指针不是eval函数
- Js的克隆对象的属性指向函数
- 是否有一种方法可以在HTML中指向特定Javascript文件的函数调用?或者,我是否在这段代码中做了一些根本性的错误
- 模拟指向localhost的函数的链接单击
- Javascript 使用该页面的 JS 函数创建指向另一个页面的链接