事件声明是否需要‘function()’?脚本函数调用报错原因咨询
checkPlacesAvailable()会触发“未定义”错误? 这里有两个核心问题需要拆解:
函数调用的时机差异
你原来的写法:$('#places').blur(function(){checkPlacesAvailable()});是把一个匿名回调函数绑定给了blur事件。这个匿名函数不会立刻执行,只有当用户触发
#places元素的blur事件时,它才会内部调用checkPlacesAvailable()。而你改写后的写法:
$('#places').blur(checkPlacesAvailable());这里的
checkPlacesAvailable()是立即执行函数——浏览器执行到这行代码时,会马上调用这个函数,然后把函数执行后的返回值(如果没有return的话就是undefined)传给blur方法作为事件处理器。这根本不是你想要的“绑定事件触发时执行函数”的逻辑。脚本加载顺序的致命影响
你的脚本引入顺序是先加载createopp.min.js,再加载validation.min.js。当createopp.min.js执行到checkPlacesAvailable()这行代码时,validation.min.js还没完成加载和执行,checkPlacesAvailable函数此时还不存在,自然会抛出“未定义”的错误。反观原来的写法,匿名函数只是被绑定,不会立即执行,等到用户触发blur事件时,两个脚本都已经加载完成,
checkPlacesAvailable函数已经被定义,所以调用正常。
如果你想直接传递函数引用(也就是你看到的示例中的写法),应该去掉括号,传递函数本身而不是执行后的结果:
$('#places').blur(checkPlacesAvailable);
但要注意,这种写法同样依赖脚本加载顺序——如果createopp.min.js先于validation.min.js加载,那在执行这行代码时,checkPlacesAvailable函数还没定义,依然会报错。解决这个问题的办法有两个:
- 调整脚本引入顺序,把
validation.min.js放在createopp.min.js前面; - 把事件绑定代码放在DOM加载完成的回调里(比如
$(document).ready(function(){ ... })),确保所有脚本都加载完成后再绑定事件。
内容的提问来源于stack exchange,提问作者magnol

