【问题标题】:IIFE and function hoisting - is not a function errorIIFE 和函数提升 - 不是函数错误
【发布时间】:2016-08-13 04:43:06
【问题描述】:
var Mod=(function () { say('hello'); 
             var say =  function (m){ console.log(m); }; 
              return ({a: 'b'}); }
 )();

VM3488:1 Uncaught TypeError: say is not a function(...)(anonymous function) @ VM3488:1(anonymous function) @ VM3488:1

但是这行得通

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

为什么会这样?如果我需要在我的 Mod 中使用“say”作为公共功能,那将如何工作?

【问题讨论】:

标签: javascript iife hoisting


【解决方案1】:

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

另请注意,您的代码 sn-ps 均未导出 say 函数,因此它仍保留为 私有 函数。

【讨论】:

  • 感谢您的快速回复。如果我需要将“say”公开为公共方法,我需要遵循什么模式?
  • @KaPr 可以是返回对象的方法:return { say: say, a: 'b' }。或者在 ES2015 中:return { say /* shorthand syntax */, a: 'b' }
【解决方案2】:

函数表达式未提升,这就是您收到错误的原因。您可以在调用之前移动表达式并将变量作为对 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.");

【讨论】:

    猜你喜欢
    • 2015-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-09
    • 1970-01-01
    • 1970-01-01
    • 2017-11-18
    • 2020-05-09
    相关资源
    最近更新 更多