2013-07-22 3 views
0

У меня есть следующий код:Как передать аргументы функции в SetTimeout

function fn($){ 
    return function(){ 
    innerFn = function(){ 
     setTimeout(show, 1000); 
    }; 

    show = function(){ 
     $.alert("TEST"); 
    } 
    } 
} 

Но после одной секунды, когда функция show запускается, он говорит $ неопределен. Как решить эту проблему?

+1

Когда и как 'fn' называется? (И как называется 'show'?) –

+0

на загруженной странице, вызовите модуль fn.like yui. – MarioDu

+0

'' 'должно быть доступно в' show', если оно определено при вызове 'fn'. –

ответ

2

как передать аргументы функции в SetTimeout

SetTimeout имеет built in mechanism для добавления Params

var timeoutID = window.setTimeout(func, delay, [param1, param2, ...]);

использовать его.

Если вы собираетесь использовать this - вы должны быть осторожны. но это другой вопрос.

+0

см. Код, я имею в виду использовать $ – MarioDu

1

Здесь есть несколько вещей. Самое главное, что ваш setTimeout никогда не вызывается, так как innerFn никогда не вызывается. Это должно сделать трюк.

function fn($){ 
    return function(){ 
    setTimeout(function(){ 
     $.alert("TEST"); 
    }, 1000); 
    } 
} 

fn(window)(); //triggers your alert after 1000ms 
+0

Я назвал innerFn в другом месте, это просто пример. Я хочу знать, как и код выше, как достичь? – MarioDu

+0

В вашем текущем примере ваша функция show имеет доступ к переменной $, так как она находится в «родительской» области. В вашем фактическом коде должно быть что-то еще. –

1

Ваш код не имеет никакого смысла, потому что ничто не называется:

function fn($){ 
    return function(){ 
    innerFn = function(){ 
     setTimeout(show, 1000); 
    }; 

    show = function(){ 
     $.alert("TEST"); 
    } 
    } 
} 

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

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

function fn($){ 
    return function(){ 
    var innerFn = function(){ 
     setTimeout(show, 1000); 
    }; 

    var show = function(){ 
     $.alert("TEST"); 
    } 

    innerFn(); 
    } 
} 

fn(window)(); 

И что будет работы. Однако это определенно избыточно. У вас может быть только:

function fn($){ 
    return function(){ 
    function show(){ 
     $.alert("TEST"); 
    } 

    setTimeout(show, 1000); 
    } 
} 

Чтобы получить тот же результат. Однако, если вы цель, просто связали аргумент setTimeout, вы можете использовать bind. Вы можете использовать 3-й параметр setTimeout, как указано в документации, но, похоже, not supported in IE for legacy reason.

Так, пример с bind воли выглядит следующим образом:

function show() { 
    this.alert('test'); 
} 

setTimeout(show.bind(window), 1000); 

Обратите также внимание, что window является глобальным объектом по умолчанию, поэтому, как правило, вы не должны делать это, просто alert достаточно. Однако, я полагаю, это не ваш фактический код, а просто простой тест, как говорит строка предупреждения.

Если вы предпочитаете иметь window в качестве первого параметра вместо этого, и вы не заинтересованы в объект контекста this, вы можете сделать что-то вроде:

function show($) { 
    $.alert('test'); 
} 

setTimeout(show.bind(null, window), 1000); 
Смежные вопросы