2012-01-21 5 views
1

Я пытаюсь создать яваскрипта замыкание, которое будет сказать мне, если функция уже была запущена:Javascript Initialization Закрытие

Это то, что я до сих пор:

function do() 
{ 
    var isInitialized = function() 
    { 
    var init = false; 

    if (init == false) 
    { 
     init = true; 
     return false; 
    } 

    return init; 
    } 

    if (!isInitialized()) 
    { 
    // do stuff 
    } 
} 

Моя функция IsInitialized всегда оценивает к истине. Я, как и 90%, уверен, что не правильно устанавливаю внутреннюю переменную. Как исправить мой код?

+0

просто переместить 'init' определения переменных в' do' функции ' isInitialized' в настоящее время не закрывает что-либо из родительской области. – newtover

ответ

1

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

function doit() { 
    if (typeof doit.isInitialized === "undefined") { 
    doit.isInitialized = true; 
    // do stuff 
    } 
} 
+0

Вам нужно будет изменить 'do' на что-то еще, так как' do' является ключевым словом. –

+0

Я думал, что это просто копирование имени Маркса. – Tom

+0

Спасибо, я закончил тем, что использовал это. Я не думал о том, чтобы назвать имя метода, когда писал свой вопрос. – Mark

2

Прежде всего, вы не можете использовать do в качестве имени функции, как that's a keyword.

Во-вторых, вы можете прикрепить свойства прямо к вашей функции, поэтому вам не нужно закрыть или что-нибудь подобное:

function f() { 
    if(f.initialized) 
     return; 
    f.initialized = true; 
    console.log('Doing things.'); 
} 
f(); 
f(); 

Это даст вам только один «делать вещи.» в консоли.

Demo (запустить с консоли JavaScript открыт): http://jsfiddle.net/ambiguous/QK27D/

0

Попробуйте это:

function fn(){ 
    if (typeof fn.hasrun!='undefined'){return;} 
    fn.hasrun=true; 
    // do stuff 
} 
0

Каждый раз, когда вы называете isinitialized, он будет сбросить все переменные по умолчанию, поэтому init ВСЕГДА будет начать вне ложных. Значения, установленные после этого, НЕ переносятся в следующий раз, когда вызывается инициализация.

То, что вы хотите, это «статическая» переменный, JS не поддерживает напрямую, но может быть смоделирован в соответствии с этим ответом: Static variables in JavaScript

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