JS 谜题 - 函数中的函数
请问以下结果能否在点击 button 后,延迟 3 秒打印结果?
<html> <body> <button>Click</button> <script src="jquery.js"></script> <script> (function(){ var delayFun = function () { alert("This is sample function"); }; $("#btn").click(function(){ setTimeout("delayFun",3000); }); })(); </script> </body> </html>
答案
不能。
原因
由于 delayFun 在一个匿名函数中定义,外部无法访问。而 setTimeout 已经脱离了当前执行环境,它的环境是 window,所以 3S 后从 window 中找不到 delayFun。
延伸
如果这里去掉 setTimeout,即:
$("#btn").click(function(){ delayFun(); });
点击 button 能立即打印结果吗?
答案:可以。
原因:click 回调函数是在最外层的匿名函数中,也就是函数中的函数(即:闭包),闭包有访问外层函数中变量的权利。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论