jQuery中无法调用闭包内sayIt函数的问题求助
问题分析与解决方法
嘿,我完全懂你折腾一整晚的崩溃感——这个错误其实是对立即执行函数表达式(IIFE)的返回值理解出了点小偏差,咱们一步步理清楚:
错误根源
看你代码里的sayIt定义:
var sayIt = (function() { alert("I can now say something."); })();
这里的IIFE是立即执行的,执行时确实会弹出alert,但因为这个匿名函数没有return任何值,所以sayIt最终被赋值为undefined,而不是一个可调用的函数。当你在blur事件里调用sayIt()时,自然会触发「不是函数」的类型错误。
两种解决方式
方式1:让IIFE返回可调用的函数(保留封装特性)
如果你想用IIFE做私有作用域封装(比如隐藏内部变量),只需要让IIFE返回一个函数即可,这样sayIt就会被赋值为这个返回的函数:
$(document).ready(function () { var sayIt = (function() { // 返回一个函数,让sayIt成为可调用的引用 return function() { alert("I can now say something."); }; })(); $("#talk").blur(function(){ sayIt(); // 现在能正常执行啦! }); });
甚至你还可以在IIFE里添加私有变量,外部无法直接访问:
var sayIt = (function() { var privateMessage = "I can now say something."; // 私有变量,外部不可见 return function() { alert(privateMessage); }; })();
方式2:直接定义函数(更简洁,无封装需求时用)
如果不需要私有作用域的封装,直接定义普通函数会更简单:
$(document).ready(function () { function sayIt() { alert("I can now say something."); } $("#talk").blur(function(){ sayIt(); }); });
内容的提问来源于stack exchange,提问作者Emeka Obianom
相关产品推荐
相关产品推荐

