首页 新闻 搜索 专区 学院

JS函数中return一个函数,如何调用这个函数,使得返回值是嵌套的函数的返回值?

0
[已解决问题] 解决于 2020-10-21 18:47

代码:

function a() {
return function() {
alert("我正在执行");
}
}
// 点击事件
window.addEventListener('click', a());

为何我这样调用函数也能执行alert代码,不应该使用a()()吗?
难道是window.addEventListener的机制影响了函数的调用吗?

一路南风的主页 一路南风 | 初学一级 | 园豆:198
提问于:2020-10-19 23:17
< >
分享
最佳答案
1

js是编译时执行的,window.addEventListener('click', a())这是就相当于你把function a()返回的函数提到别的作用域,而你写a()()这会在加载时调用a(),然后在调用function a()的返回值

奖励园豆:5
月下大庚角 | 菜鸟二级 |园豆:203 | 2020-10-20 09:39

为什么会在加载的时候就调用了a(),而不是点击事件触发时再调用呢?

一路南风 | 园豆:198 (初学一级) | 2020-10-20 13:29
其他回答(2)
1

如果直接定义函数,就直接写函数名就行了,所以上面的a()没问题,先调用a获取其返回值然后再调用

function a() {
    alert("我正在执行");
}
window.addEventListener('click', a);
E行者 | 园豆:1289 (小虾三级) | 2020-10-20 08:24

其实是我没有搞清楚addEventListener的参数,因为第二个参数必须是一个函数,所以如果我想在点击事件触发时显示alert的内容,必须将return的那个函数赋值给点击事件,所以这里写a()就行了。
但是还有一点没搞清楚,写a()()为什么会在没点击之前就执行alert呢?而且之后再点击也无法执行?

支持(0) 反对(0) 一路南风 | 园豆:198 (初学一级) | 2020-10-20 13:26

@一路南风: a()()是直接调用执行方法,不是方法本事

支持(1) 反对(0) E行者 | 园豆:1289 (小虾三级) | 2020-10-20 14:55
1

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 事件触发的时候执行这个返回值
你搞懂了吗?

by.Genesis | 园豆:2006 (老鸟四级) | 2020-10-20 17:22

不是的,a()()并不会在click触发的时候执行,在页面加载的时候就执行完毕了

支持(0) 反对(0) 一路南风 | 园豆:198 (初学一级) | 2020-10-20 17:46

@一路南风: 我不是说的立即执行吗?

支持(0) 反对(0) by.Genesis | 园豆:2006 (老鸟四级) | 2020-10-20 17:47

是的,但是这个立即执行的函数只会执行一次,click事件不会触发它了

支持(0) 反对(0) 一路南风 | 园豆:198 (初学一级) | 2020-10-20 18:02

@一路南风: 那么你想要实现一个什么效果呢

支持(0) 反对(0) by.Genesis | 园豆:2006 (老鸟四级) | 2020-10-20 18:35

@by.Genesis: 点击一次窗口就alert一下,所以addEventListener里面应该写a(),而不是a()()

支持(0) 反对(0) 一路南风 | 园豆:198 (初学一级) | 2020-10-20 18:39
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册