2012-06-08 2 views
10

Есть ли причина использовать функцию самозапуска с именем?Именованная функция самоиспускания

Например:

(function foo() 
{ 
    alert('Hello World! Named Self Invoking Function Here'); 
})(); 

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

Есть ли какие-то времена, когда было бы разумно назвать функцию самозапуска, как указано выше?

+1

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

+3

Канонический пример - это рекурсия: '(функция fib (n) {return n <= 2? N-1: fib (n-1) + fib (n-2);}) (7)' – davin

+0

Возможно, потому что код внутри используется имя функции? – MaxArt

ответ

10

Если вам нужна рекурсивная самоосуществляющуюся функция, то это может иметь смысл:

(function loop(i) { 
    console.log(i); 
    i++; 
    if(i < 10) { 
     loop(i); 
    } 
})(0); 
+0

Демонстрация: http://jsfiddle.net/9xrvB/ Я этого раньше не видел. –

+0

И, кстати, с комбинатором Y это можно было бы достичь, не назвав функцию. – penartur

+0

@penartur - У вас есть демо? –

5

Я использую этот шаблон для опроса данных с серверов периодически. Это делает код менее беспорядочным (особенно setTimeout).

(function poll() { 
    $.get("/somedata", function (data) { 
    // Processing data... 
    setTimeout(poll, 1000); 
    }); 
})(); 
+0

любя это, спасибо! – Dogoku

3

Это было бы полезно для рекурсии, но пока вы должны избегать названных функциональных выражений. Они не поддерживаются правильно в Internet Explorer до версии 9.

См: http://javascript.info/tutorial/functions-declarations-and-expressions

"IE < 9 не поддерживает НФО"

+0

Он не говорит «не поддерживается», он говорит, что «не выполнено правильно». Если вы знаете причуды и знаете, что это на самом деле не влияет на вас (что в основном происходит), вы все равно можете использовать их без сбоев IE. Обязательно прочитайте эту тему: http://kangax.github.io/nfe/#jscript-bugs – Bergi

+0

@Bergi: Я не сказал «не поддерживается», я сказал, что «не поддерживается правильно». Если вы хотите разделить слухи, здесь, конечно, разница между поддерживаемой и реализованной, но что она не реализована правильно, так это то, что она не поддерживается правильно. – Guffa

+0

Моя английская фраза слишком плоха для того, чтобы расколоть все равно, извините: -/Но я не имел в виду то, что вы сказали, но эту цитату, которую вы дали. – Bergi

0

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

например,

function bigFunction() { 
    (function doTheFirstThing() { 
     //code here. 
    })(); 
    (function doTheSecondThing() { 
    //code here. 
    })(); 
} 
+0

IEFE, похоже, слишком завышены. Используйте их только в том случае, если вы * нуждаетесь в закрытии (для сбора/подсчета мусора), для чего-либо еще комментариев (и, возможно, [блоков] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statement/block)). – Bergi

+1

@Ben Roberts Когда-либо слышал о ярлыках JavaScript? –

0

Вы можете использовать его для инициализации, строка кода, который вы должны запустить первый, а затем он будет вызывать другой сценарий.

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