2014-01-04 4 views
0

Могу ли я иметь что-то вроде этого, где функция возвращает var, которая сама по себе является функцией, выполняющей операцию над элементом DOM?Функция для возврата функции var

var foo = function() { 

    var blah = function() { 
     document.getElementById('box').style.color="red"; 
    }; 

    return blah; 

}; 

setTimeout(function() { 

    foo(); 

}, 2000); 



<div id="box">This is some div</div> 

EDIT:

Спасибо за все советы, он работает, как вы указали. немного следить ... Могу ли я сделать аналогичный с возвращенным объектом?

var foo = function() { 

    var blah = function() { 
     document.getElementById('box').style.color="red"; 
    }; 

    var flop = function() { 
     document.getElementById('box').style.color="green"; 
    }; 

    return { 
     blah: blah, 
     flop: flop 
    }; 

}; 


var newInstance = foo(); 

setTimeout(function() { 

    newInstance.blah; 

}, 2000); 

setTimeout(function() { 

    newInstance.flop; 

}, 4000); 



<div id="box">This is some div</div> 
+3

Я не понимаю, где должно быть получено возвращаемое значение. Вы имеете в виду что-то вроде 'setTimeout (foo(), 2000)'? Немного больше контекста поможет. –

+0

@cookiemonster Я почти уверен, что это то, что предназначено, но трудно сказать. – Pointy

+1

@Pointy: Да, все зависит от того, когда все внутри 'foo' еще вне' blah' должно быть выполнено. Нет ничего похожего на неопределенные примеры использования бессмысленных имен функций, чтобы затушить актуальную проблему. –

ответ

2

Да, но вы должны назвать его так:

foo()(); 

Первый набор скобок получает выражение функции, то вторая выполняет выражение функции.

Поскольку Foo возвращает функцию, я думаю, что код может быть записан следующим образом:

setTimeout(foo(), 2000); 
+0

О чем ты говоришь? –

+1

В своем коде запрашивающий лицо имеет выражение, которое получает функцию, но не вызывает ее. Ему нужно вызвать функцию, чтобы вернуть возвращаемую функцию, а затем вызвать эту функцию, которая была возвращена. – Marcos

0

Функции в JavaScript являются гражданами первого класса, так что ответ да: foo()().

3

Да, вы можете это сделать. Ваш пример близок. То, что вы хотите сделать, это:

setTimeout(function() { 

    var result = foo(); 
    result(); 

}, 2000); 

или более сжато:

setTimeout(function() { 

    foo()(); 

}, 2000); 

Внутренний foo() вызов возвращает функцию, и теперь вам нужно вызвать эту функцию путем наклеивания еще одну пару скобок на этот результат ,

UPDATE

Кроме того, поскольку setTimeout() ожидает функции в качестве первого параметра в любом случае, вы можете просто сделать это:

setTimeout(foo(), 2000); 

Таким образом, вы вызываете foo() который возвращает функцию, и передавая эту функцию непосредственно до setTimeout(). У вашего мозга головокружение еще? =)

1

Возьмите анонимную функцию обертку прочь:

setTimeout(foo(), 2000); 

Это будет проходить в setTimeout функцию, которая возвращенное при вызове «Foo». Вам не нужно обертывать его в другую анонимную функцию.

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