代码:
function a() {
return function() {
alert("我正在执行");
}
}
// 点击事件
window.addEventListener('click', a());
为何我这样调用函数也能执行alert代码,不应该使用a()()吗?
难道是window.addEventListener的机制影响了函数的调用吗?
js是编译时执行的,window.addEventListener('click', a())
这是就相当于你把function a()
返回的函数提到别的作用域,而你写a()()
这会在加载时调用a()
,然后在调用function a()
的返回值
为什么会在加载的时候就调用了a(),而不是点击事件触发时再调用呢?
如果直接定义函数,就直接写函数名就行了,所以上面的a()没问题,先调用a获取其返回值然后再调用
function a() {
alert("我正在执行");
}
window.addEventListener('click', a);
其实是我没有搞清楚addEventListener的参数,因为第二个参数必须是一个函数,所以如果我想在点击事件触发时显示alert的内容,必须将return的那个函数赋值给点击事件,所以这里写a()就行了。
但是还有一点没搞清楚,写a()()为什么会在没点击之前就执行alert呢?而且之后再点击也无法执行?
@一路南风: a()()是直接调用执行方法,不是方法本事
function a() {} 表示定义一个函数
window.addEventListener('click', a) 表示将函数 a 注册到 window 对象的 click 事件处理程序,当 window 的 click 事件触发的时候,函数 a 就会执行
a() 表示立即执行函数 a
window.addEventListener('click', a()) 表示将函数 a 执行后得到的返回值注册到 window 对象的 click 事件处理程序,当 window 的 click 事件触发的时候执行这个返回值
a()() 表示立即执行函数 a 执行后返回的函数
window.addEventListener('click', a()()) 表示将函数 a 执行后返回的函数再执行之后得到的返回值注册到 window 对象的 click 事件处理程序,当 window 的 click 事件触发的时候执行这个返回值
你搞懂了吗?
不是的,a()()并不会在click触发的时候执行,在页面加载的时候就执行完毕了
@一路南风: 我不是说的立即执行吗?
是的,但是这个立即执行的函数只会执行一次,click事件不会触发它了
@一路南风: 那么你想要实现一个什么效果呢
@by.Genesis: 点击一次窗口就alert一下,所以addEventListener里面应该写a(),而不是a()()
return后就是一个立即执行函数,所以等同于function a(){
return alert("我正在执行")}