最近,遇到一个点击button按钮没反应的bug,发现原因后,让我对$(function(){})中的函数无法被外界调用的这一知识点仔细梳理了一下,在此记录分享,希望能帮助到遇到同样问题的小伙伴!
概念
$(function(){ })
实际上是匿名函数。这是JQuery的语法,$表示JQuery对象,可以有好几种用法。比如传递选择器字符串、页面对象等,如果直接传函数体进去,表示当页面加载完毕时执行这个函数。
实践
<button onclick="print_1()" >点击打印1</button>
<script>
$(function(){
function print_1(){
console.log("1")
}
})
</script>
<button id="btn">点击打印1</button>
<script>
$(function(){
function print_1(){
console.log("1")
}
})
$("#btn").on('click',function(){
print_1();
})
</script>
解释
- $(function(){})是一个匿名函数,
print_1()
是在这个匿名函数里声明的,所以只有在这个匿名函数里面可以访问到。而在button标签中onclick = "print_1()"
这样写的话,表明是要调用window 上的 print_1()
,但是window上没有声明print_1()函数,所以提示 “print_1 is not defined”(找不到)。 - 同理,通过
$("#btn").on('click',function(){})
事件调用的也是在window上调用print_1()函数,但是window上没有声明print_1()函数,所以提示 “print_1 is not defined”(找不到)。这其实是涉及到了js函数作用域的问题。
解决方式
- 将函数写在$(function(){})外面
<button onclick="print_1()">点击打印1</button>
<script>
function print_1(){
console.log("1")
}
</script>
- 在$(function(){})中通过事件调用方法
<button id="btn">点击打印1</button>
<script>
$(function(){
function print_1(){
console.log("1")
}
$("#btn").on('click',function(){
print_1();
})
})
</script>