var element = document.getElementById('element');
var user = {
firstname: 'Wilson',
greeting: function(){
alert('My name is ' + this.firstname);
}
};
// Attach user.greeting as a callback
element.addEventListener('click', user.greeting);
// alert => 'My name is undefined'
为什么运行的时候,拿不到上下文的值firstname的值
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
这不是上下文件的问题,是
this
的问题。像下面这么改下就对了:
@边城狂人 已经把问题解释清楚了,只是做点补充说明。
问题是怎么出现的
JS中的
this
只与函数调用方式有关,与定义时的上下文,函数作用域,都无关。有如下情况:当程序执行到
user.greeting
作为addEventListener
的第二个参数,假设这个参数就叫handler
。可以想象,在addEventListener
的内部,进行了类似的过程,
this
的指向就发生了改变。如何修复
this
的指向只与函数调用方式有关,函数调用方式一共四种:要修复这个问题,需要用到
apply/call
这种调用方式。我们可以想象bind
是这样一个函数:这样,就可以使用
element.addEventListener('click', user.greeting.bind(user));
来解决这个问题了。当然,这里的bind
是非常简化、不可用的,比如可以看到bind
return的函数已经不是原函数了,为了保持一致性应该绑定原型链。这一系列完整的操作在MDN文档中都可以看到。为什么对
<a href="#" class="link-black text-sm rbtn"><i class="fa fa-share margin-r-5"></i>回复</a>
绑定的时间会失效了?单纯静态网页的时候是可以触发动作,使用了动态刷新就会失效。这是什么原因?jquery只对页面载入的部分元素进行选择?