如何通过.on("load")获取函数返回值并存入变量?
解决立即执行函数表达式(IIFE)的引用错误并保存返回值
你遇到的问题核心在于:**命名式立即执行函数表达式(IIFE)**里的函数名,只在该函数的内部作用域有效,外部根本访问不到它——这就是为什么你后面写item.on("load", myFunction)时会抛出Uncaught ReferenceError: myFunction is not defined的原因。
下面给你几个实用的解决方案,按需选择:
方案1:拆分定义、执行与绑定(最推荐)
先单独定义函数,这样既能立即执行获取返回值,又能把函数绑定到load事件,逻辑清晰且易维护:
function myFunction() { var something = 0; return something; } // 立即执行函数,把返回值存入变量 var mySomething = myFunction(); // 将函数绑定到元素的load事件 item.on("load", myFunction); console.log(mySomething); // 输出 0
方案2:用IIFE返回包含函数和值的对象
如果一定要用IIFE的写法,可以让它返回一个对象,同时暴露函数本身和计算出的返回值:
var wrapper = (function myFunction() { var something = 0; // 返回对象,同时提供函数引用和返回值 return { func: myFunction, value: something }; })(); // 提取返回值到mySomething var mySomething = wrapper.value; // 绑定函数到load事件 item.on("load", wrapper.func); console.log(mySomething); // 输出 0
这里IIFE内部的myFunction可以被自身引用,通过返回对象把它暴露给外部作用域,就能正常绑定事件了。
方案3:先绑定事件,再手动执行函数
如果函数在load触发时和立即执行时的逻辑完全一致,也可以先绑定事件,再手动调用一次来获取值:
function myFunction() { var something = 0; return something; } // 先绑定load事件 item.on("load", myFunction); // 手动执行函数,保存返回值 var mySomething = myFunction(); console.log(mySomething); // 输出 0
补充说明原代码报错原因
你写的是命名函数表达式的IIFE,这种语法下,函数名myFunction是该函数的内部标识符,不属于外部作用域,所以外部无法直接引用它。只有把函数暴露到外部作用域(比如单独定义、或者通过返回对象暴露),才能在item.on里正常使用。
内容的提问来源于stack exchange,提问作者user25976
相关产品推荐
相关产品推荐

