IIFE 和函数提升——不是函数错误

IIFE and function hoisting - is not a function error

var Mod=(function () { say('hello'); 
             var say =  function (m){ console.log(m); }; 
              return ({a: 'b'}); }
 )();

VM3488:1 未捕获类型错误:say 不是函数(...)(匿名函数)@VM3488:1(匿名函数)@VM3488:1

但这行得通

var Mod = (function () { 
              say('hello');  
              function say (m){ console.log(m); };
              return ({a: 'b'}); }
     )();

为什么会这样?如果我需要在我的 Mod 中使用 "say" 作为 public 函数,那将如何工作?

那是因为函数表达式没有提升。第一个是函数表达式,第二个是提升的 函数语句

另请注意,您的代码片段都没有导出 say 函数,因此它仍然是一个 private 函数。

函数表达式未提升,这就是您收到错误的原因。您可以在调用前移动表达式并 return 变量作为对 IFFE 的响应。现在你可以在其他地方调用 say() 了。

var Mod=(function () { 
             var say =  function (m){ console.log(m); }; 
              say('hello'); 
              return {say: say}; 
})();

Mod.say("say what you want to say.");