2016-01-10 6 views
2

У меня есть код IIFE в моем коде, где есть несколько других IIFE. Все они имеют имена (поэтому они не анонимны). Я хочу вызывать некоторые из IIFE позже (я имею в виду, да, они выполняют свою работу в начале, но я хочу использовать их позже), другой функцией. Как и в примере:Invoke IIFE «позже» с параметрами

(function start() 
{ 
    /* some code*/ 

    (function firstIIFE(param1, param2) 
    { 
    if (param1 && param2) 
    { 
     console.log('param1 ',param1, 'param2 ',param2); 
     return; 
    } 
    /* some code done when IIFE originally was self-invoked */ 
    }(param1, param2)); 

    /* some code */ 
}()); 

function foo() 
{ 
    start.firstIIFE(param1, param2); 
} 

Можно ли, чтобы вызвать (firstIIFE) IIFE позже? Поскольку я хочу, чтобы эта функция выполняла некоторые действия с param1 и param2 (которые я создал после вызова IIFE)? В настоящее время я получил ошибку как: неперехваченного ReferenceError: param1 не определен

+1

'IIFE' => __Immediately Invoked Function Expression__ Почему вы хотите, чтобы они были выполнены позже? – Rayon

+0

Потому что они делают что-то вроде того, что я хочу сделать с новыми параметрами (созданными после того, как IIFE выполнил свою работу). – Chris92

+2

У вас может быть переменная, которая может содержать выражение функции, и вы можете использовать эту переменную где угодно, если хотите, чтобы выполнялись общие манипуляции. – Rayon

ответ

1

Названия функциональных выражений не доступно для сферы, где они созданы, и, следовательно, не может быть вызваны из этой сферы без сохранения ссылку на функцию в переменной.
Но сохранение ваших функций в переменных вместо их объявления имеет побочный эффект, заключающийся в том, что вы не поднимаете свою функцию до верхней части текущей области, чего вы редко хотите.

Вы можете сделать:

(foo = function myNameIsKnownOnlyToMyself() { 
    ... 
})(); 

foo(); // again! 

, если вы действительно любите свою картину IIFE, но, как другие говорили, это, вероятно, не самое элегантное решение вашей проблемы.

+0

Почему 'foo' является глобальным в этом примере? – Chris92

+0

@ Chris92 Поскольку в JavaScript, когда вы используете имя переменной, не объявив ранее ее в текущей области, JavaScript будет искать ее во внешних областях до тех пор, пока она не окажется в глобальной области действия, и в этом случае она будет проверять ее как свойство указанного глобального объекта. Поскольку вы можете догадаться, что поведение подвержено ошибкам, поэтому текущие версии JS позволяют вам деактивировать его с помощью [Строгий режим] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/ Strict_mode) в ваших функциях или во всем мире. – lleaff

+0

Хорошо, правильно. Но имея '(var foo = function() {}());' неправильный IIFE? – Chris92

3

Способ, которым написан ваш код, вы не сможете получить доступ к firstIIFE() за пределами start(), так как это внутренняя функция. Чтобы получить к нему доступ позже, вам нужно будет разоблачить его каким-то образом: либо установив внешнюю переменную в эту функцию, либо перемещая ее за пределы start() и имея start(), просто вызывайте функцию, а не определяя ее, а затем сразу ее выполняете :

function firstIIFE(param1, param2) { 
    if (param1 && param2) { 
    console.log('param1 ',param1, 'param2 ',param2); 
    return; 
    } 
    /* some code done when IIFE originally was self-invoked */ 
} 

(function start() { 
    /* some code*/ 

    firstIIFE(param1, param2); 

    /* some code */ 
}()); 

function foo() { 
    firstIIFE(param1, param2); 
} 

(в этот момент вы, вероятно, не нужно называть его firstIIFE(), так как не следует сразу же запущенной функции шаблона Expression больше, а это теперь просто нормальный вызов функции).

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

  • Нет связанных вопросов^_^