2016-08-13 3 views
1
var Mod=(function() { say('hello'); 
      var say = function (m){ console.log(m); }; 
       return ({a: 'b'}); } 
)(); 

VM3488: 1 Uncaught TypeError: скажем, не является функцией (...) (анонимная функция) @ VM3488: 1 (анонимная функция) @ VM3488: 1IIFE и функция подъема - это не функция ошибки

но это работает

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

Почему это происходит? Если мне нужно использовать «say» в качестве публичной функции в своем модуле, как это будет работать?

+0

Это не имеет ничего общего с IIFE, но читать это: http://stackoverflow.com/questions/3887408/javascript-function-declaration-and-evaluation-order/3887590# 3887590 – slebetman

ответ

2

Это потому, что выражения функций не являются hoisted. Первый - это выражение функции, а второе - это оператор, который поднят.

Также обратите внимание, что ни один из фрагментов кода не экспортирует функцию say, поэтому он остается в виде частных функций.

+0

thx для быстрого ответа. Какой шаблон мне нужно выполнить, если мне нужно выставить «say» в качестве общедоступного метода? –

+0

@KaPr Это может быть метод возвращаемого объекта: 'return {say: say, a: 'b'}'. Или в ES2015: 'return {say/* сокращенный синтаксис * /, a: 'b'}' – undefined

1

Выражения функций не поднимаются, поэтому вы получаете сообщение об ошибке. Вы можете переместить выражение перед вызовом и вернуть переменную в качестве ответа на ваш 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.");

Смежные вопросы