匿名回调函数中的this指向
在平时对setTimeout
addEventListener
这种函数的使用,都会传入一个匿名的callback函数
如:
1.
window.setTimeout(function() {
console.log(this)
}, 1000)
或者
2.
var el = document.getElementById('wrapper')
el.addEventListener('click', function() {
console.log(this)
}, false)
上述情况1中this
会指向setTimeout
函数的caller -> window对象
而情况2中this
也会指向addEventListener
函数的caller -> wrapper这个对象
但是我自己类似于window.setTimeout
这样创建了一个对象
var a = {
b: 'b in a',
c: function (callback) {
callback()
}
}
//调用a对象的c函数,传入匿名函数作为参数
a.c(function() {
//本以为this是指向a的,会输出字符串'b in a',实际此时this指向window
console.log(this.b)
})
我原本以为会类似于window.setTimeout
el.addEventListener
那样,this会指向.
(点号)之前的对象。
然后我改了一下对象a
var a = {
b: 'b in a',
c: function (callback) {
callback.bind(this)()
}
}
这个时候this才指向a。
那么问题来了:
1.像这种匿名函数传参的用法,为什么使用我自己定义的对象和浏览器提供的api产生的效果不一样呢?这种类型的this的指向应该如何更好的理解?
2.是不是像setTimeout
、addEventListener
这种系统api,它的内部实现就帮我们去把this
bind给了调用这个方法的对象,如setTimeout
中就有callback.bind(window)
和addEventListener
就有callback.bind(el)
?
有没有各路大神可以解答一下,小弟感激不尽。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
关于this的指向的优先级
new Foo()
绑定新对象bind/call/apply
绑定指定的对象绑定上下文
那么楼主的代码,为了描述我命了名。
补充 addEventListener 的说明
以下为一段为了浏览器兼容而提供的
polyfill
代码这段代码结合上述规则可以很清楚的说明
addEventListener
的this
addEventListener polyfill 链接
你可以把this当做function的一个隐藏参数,相当于
事实上基本所有语言也都是这么处理的。所以当this不对的时候,可以用bind显性地传递这个参数。
检查一个function是否绑定了this这个参数可以用下面的方法:
事件监听那里可能是做了特殊处理,毕竟JS是个设计糟糕的语言(哈)
MDN bind
匿名函数的this默认都是指向window。对于元素事件监听的函数里面this指向元素自身,才属于是特殊情况。