Як я можу передати параметр зворотному виклику setTimeout ()?


825

У мене є код JavaScript, який виглядає так:

function statechangedPostQuestion()
{
  //alert("statechangedPostQuestion");
  if (xmlhttp.readyState==4)
  {
    var topicId = xmlhttp.responseText;
    setTimeout("postinsql(topicId)",4000);
  }
}

function postinsql(topicId)
{
  //alert(topicId);
}

Я отримую помилку, що topicId не визначена. Все працювало до того, як я використав цю setTimeout()функцію.

Я хочу, щоб моя postinsql(topicId)функція була викликана через деякий час. Що я повинен зробити?


75
боляче коментує таку стару тему, але мені просто потрібно запропонувати третю версію (яка, на мій погляд, набагато чистіша): setTimeout (postinsql.bind (null, topicId), 4000)
Hobblin

14
@Hobblin: чому б зашкодити встановити запис прямо? Чи не завадить іншим більше зациклюватися на цьому популярному питанні та побачити старий, невмілий стиль дзвінків?
Дан Даскалеску


@dbliss Моя пропозиція вже згадувалася у кількох відповідях та додана як відповідь тут: stackoverflow.com/a/15620038/287130 Але я рада, що моя пропозиція оцінена;)
Гоблін

@Hobblin ах, велике спасибі за вказівку на це. я прокрутив шукаючи відповідь, опубліковану вами, і пропустив це.
dbliss

Відповіді:


1122
setTimeout(function() {
    postinsql(topicId);
}, 4000)

Вам потрібно подавати анонімну функцію як параметр замість рядка; останній метод не повинен працювати навіть за специфікацією ECMAScript, але браузери просто м'які. Це правильне рішення, ніколи не покладайтеся на те, щоб передавати рядок як "функцію" при використанні, setTimeout()або setInterval()це повільніше, тому що її потрібно оцінювати, і це просто неправильно.

ОНОВЛЕННЯ:

Як сказав Гобблін у коментарі до цього питання, тепер ви можете передавати аргументи функції всередині setTimeout, використовуючи Function.prototype.bind().

Приклад:

setTimeout(postinsql.bind(null, topicId), 4000);

30
window.setTimeoutє методом DOM, і як такий не визначений специфікацією ECMAScript. Передавання рядка завжди працювало в браузерах, і це фактично стандарт - насправді, можливість передавати об'єкт функції було додано пізніше, за допомогою JavaScript 1.2 - це явно частина специфікації проекту HTML5 ( whatwg.org/specs/web -apps / current-work / multipage /… ). Однак використання рядка замість об'єкта функції, як правило, вважається поганим стилем, оскільки це, по суті, форма затримки eval().
Майлз

2
var temp = setTimeout (function () {postinsql (topicId);}, 4000); clearTimeout (темп); ??
Джош Мак

12
Що станеться, якщо topicId буде змінено після встановлення тайм-ауту, але перед викликом функції?
pilau

22
@pilau - це якраз моя проблема: якщо змінні, які використовуються в анонімній функції, змінюються до часу очікування (наприклад, у циклі for), то це також зміниться всередині функції. Тож у моєму прикладі встановлення 5 різних тайм-аутів у циклі for for фактично закінчилося використанням одних і тих же змінних. Будьте обережні, використовуючи цю відповідь!
Крістіан

10
@pilau використання іншого закриття допоможе topicId = 12; функція postinsql (topicId) {console.log (topicId); } функція setTimeOutWithClosure (topicId) {setTimeout (функція () {postinsql (topicId);}, 1000)} setTimeOutFunction (topicId); topicId = 13;
Halis Yılboğa

727

У сучасних браузерах "setTimeout" отримує третій параметр, який надсилається як параметр внутрішній функції в кінці таймера.

Приклад:

var hello = "Hello World";
setTimeout(alert, 1000, hello);

Детальніше:


56
Я не впевнений, чому ця відповідь не була обрана найкращою. Використання анонімної функції працює, звичайно, але якщо ви можете просто передати третій параметр у вихідний виклик функції setTimeout ... чому б ні?
Kris Schouw

54
Тому що він не працює у версіях IE, як і раніше, дуже багато в дикій природі.
Аарон

4
Ця відповідь насправді дала мені змогу передавати об’єкт події, інші методи цього не зробили. У мене вже була анонімна функція.
Гленн Плас

27
Набагато краща відповідь. Якщо у вас є код, який змінює ваш параметр між викликом "setTimeout" і фактичним виконанням анонімної функції - анонімна функція отримає змінене значення, а не те, що було під час виклику setTimeout. наприклад: для (var i = 0; i <100; i ++) {setTimeout (функція () {console.write (i);}, 0); } це запише "100" 100 разів (тестується на FF). Поточна відповідь допомагає уникнути цього.
корінь

1
Запис на developer.mozilla.org/es/docs/Web/API/WindowTimers/setTimeout аргументи зворотного виклику для Internet Explorer підтримуються лише у версіях> = 10, будьте обережні, як на багатьох сайтах ie8 і ie9 все ще отримує певну частку.
le0diaz

154

Провівши деякі дослідження та тестування, єдиним правильним виконанням є:

setTimeout(yourFunctionReference, 4000, param1, param2, paramN);

setTimeout передасть всі додаткові параметри вашій функції, щоб вони могли там оброблятися.

Анонімна функція може працювати для дуже базових матеріалів, але всередині об'єкта, де вам доведеться використовувати "це", немає ніякого способу змусити її працювати. Будь-яка анонімна функція змінить "це", щоб вказати на вікно, так що ви втратите свою посилання на об'єкт.


24
Із сумом у душі я повинен повідомити: це не працює в Internet Explorer. : / Усі зайві парами проходять через невизначене.
Амальговінус

6
Я просто використовуюvar that = this; setTimeout( function() { that.foo(); }, 1000);
Ед Вільямс

2
Це правильно, і це вказано в HTML5. whatwg.org/specs/web-apps/current-work/multipage/…
Гаррет

4
Це точно така ж відповідь, як і Фабіо .
Дан Даскалеску

1
Запис на developer.mozilla.org/es/docs/Web/API/WindowTimers/setTimeout аргументи зворотного виклику для Internet Explorer підтримуються лише у версіях> = 10, будьте обережні, як на багатьох сайтах ie8 і ie9 все ще отримує певну частку.
le0diaz

45

Це дуже старе запитання з уже "правильною" відповіддю, але я подумав, що я згадаю про інший підхід, про який тут ніхто не згадував. Це скопійовано та вставлено із чудової бібліотеки підкреслення :

_.delay = function(func, wait) {
  var args = slice.call(arguments, 2);
  return setTimeout(function(){ return func.apply(null, args); }, wait);
};

Ви можете передати скільки завгодно аргументів функції, викликаній setTimeout і як додатковий бонус (ну зазвичай бонус) значення аргументів, переданих вашій функції, заморожуються під час виклику setTimeout, тому якщо вони змінюють значення в якийсь момент між тим, коли викликається setTimeout (), і коли він закінчується, ну ... це вже не так жахливо засмучує :)

Ось загадка, де ви можете побачити, що я маю на увазі.


7
Ця відповідь насправді працює, але, здається, у вас є бібліотека, якої я не маю. Ось невеличкий виправлення для його роботи: замість slice.call використовуйте Array.prototype.slice.call (аргументи, 2)
Меланія

7
@Melanie "якась бібліотека"? Я відповів, що це бібліотека підкреслення - underscorejs.org . Але так, Array.prototype.slice відчувається, щоб розрізати всередині цієї бібліотеки, тому вам доведеться це робити самостійно, якщо ви не користуєтесь ним, гарне місце :)
David Meister

38

Нещодавно я натрапив на унікальну ситуацію необхідності використовувати setTimeoutв циклі . Розуміючи це, ви можете допомогти вам зрозуміти, як передавати параметри setTimeout.

Спосіб 1

Використовуйте forEachта Object.keys, згідно з пропозицією Сукіми :

var testObject = {
    prop1: 'test1',
    prop2: 'test2',
    prop3: 'test3'
};

Object.keys(testObject).forEach(function(propertyName, i) {
    setTimeout(function() {
        console.log(testObject[propertyName]);
    }, i * 1000);
});

Я рекомендую цей метод.

Спосіб 2

Використання bind:

var i = 0;
for (var propertyName in testObject) {
    setTimeout(function(propertyName) {
        console.log(testObject[propertyName]);
    }.bind(this, propertyName), i++ * 1000);
}

JSFiddle: http://jsfiddle.net/MsBkW/

Спосіб 3

Або якщо ви не можете використовувати forEachабо bindвикористовувати IIFE :

var i = 0;
for (var propertyName in testObject) {
    setTimeout((function(propertyName) {
        return function() {
            console.log(testObject[propertyName]);
        };
    })(propertyName), i++ * 1000);
}

Метод 4

Але якщо вам не байдуже IE <10, тоді ви можете скористатись пропозицією Fabio :

var i = 0;
for (var propertyName in testObject) {
    setTimeout(function(propertyName) {
        console.log(testObject[propertyName]);
    }, i++ * 1000, propertyName);
}

Метод 5 (ES6)

Використовуйте блок-змінну:

let i = 0;
for (let propertyName in testObject) {
    setTimeout(() => console.log(testObject[propertyName]), i++ * 1000);
}

Хоча я по- , як і раніше рекомендую використовувати Object.keysз forEachв ES6.


2
Примітка: .bindне працюватиме для IE8 та нижче [ref: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… ]. Я закінчив з використанням Schien в розчин: stackoverflow.com/a/21213723/1876899
cjspurgeon

1
Якщо ви в середовищі, яке використовує, bindто ваше також в середовищі, яке пропонує Object.keysі forEach. Ви можете звільнити цикл for і отримати "вільну" (як у двох птахів з одним каменем вільний без ресурсів) область функцій в процесі.
Сукіма

@David Sherret, якщо ви його раніше не використовували, обов'язково перегляньте asyncбібліотеку ( github.com/caolan/async ). Ми широко використовуємо його у вітрилах і за останні 2 роки мали чудові результати. Він надає методи як паралельно і послідовно для асинхронної forEach, map, reduceі т.д.
mikermcneil

25

Гобблін вже прокоментував це питання, але це має бути справді відповідь!

Використання Function.prototype.bind()- це найчистіший і гнучкіший спосіб зробити це (з додатковим бонусом за можливість встановити thisконтекст):

setTimeout(postinsql.bind(null, topicId), 4000);

Для отримання додаткової інформації дивіться ці посилання MDN:
https://developer.mozilla.org/en/docs/DOM/window.setTimeout#highlighter_547041 https://developer.mozilla.org/uk/docs/JavaScript/Reference/Global_Objects/Function / bind # With_setTimeout


цей контекст можна передати з першим аргументом зв’язуванняsetTimeout(postinsql.bind(this, topicId), 4000);
Джузеппе Галано

@GiuseppeGalano повністю, я згадав , що в моїй обороні, але це не потрібно для цього прикладу :)
Дейн

Захоплюючий, скільки замовчує часткове використання програм bind. Це справді створює якийсь читабельний код.
Сукіма

bind () підтримується лише з IE9 +, тому такий підхід не працюватиме для <IE9
Сандєєв

@Sanjeev Використовуйте ES5 shim, щоб він працював у старшому IE: github.com/es-shims/es5-shim
gregers

17

Деякі відповіді правильні, але суперечливі.

Я відповідаю на це ще раз, через 4 роки, тому що я все ще стикаюся із надто складним кодом, щоб вирішити саме це питання. Є елегантне рішення.

Перш за все, не передайте рядок як перший параметр при виклику setTimeout, оскільки він ефективно викликає виклик до функції повільного "eval".

Тож як ми переходимо в параметрі до функції таймауту? За допомогою закриття:

settopic=function(topicid){
  setTimeout(function(){
    //thanks to closure, topicid is visible here
    postinsql(topicid);
  },4000);
}

...
if (xhr.readyState==4){
  settopic(xhr.responseText);
}

Деякі пропонують використовувати анонімну функцію під час виклику функції очікування:

if (xhr.readyState==4){
  setTimeout(function(){
    settopic(xhr.responseText);
  },4000);
}

Синтаксис працює. Але до того часу, коли буде викликано сетопік, тобто через 4 секунди, об'єкт XHR може бути не однаковим. Тому важливо попередньо зв’язати змінні .


1
+1 для читабельного рішення, трохи іншого від мого. Якщо у вас є setTimeout всередині функції settopic, у мене функція fDelayed (ваша settopic) всередині функції setTimeout.
Домінік

11

Моя відповідь:

setTimeout((function(topicId) {
  return function() {
    postinsql(topicId);
  };
})(topicId), 4000);

Пояснення:

Створена анонімна функція повертає ще одну анонімну функцію. Ця функція має доступ до первісно переданого topicId, тому вона не помилиться. Перша анонімна функція негайно викликається, передаючи її topicId, тому зареєстрована функція із затримкою має доступ до topicIdмоменту виклику через закриття.

АБО

В основному це перетворюється на:

setTimeout(function() {
  postinsql(topicId); // topicId inside higher scope (passed to returning function)
}, 4000);

EDIT: Я бачив ту саму відповідь, тому подивіться на його. Але я не вкрав його відповіді! Я просто забув подивитися. Прочитайте пояснення та перевірте, чи це допомагає зрозуміти код.


Це найкраща відповідь. Багато з цих рішень навіть не виграють тайм-аут. Однак чому ви вкладаєте в дужки першу анонімну функцію? Я не думаю, що вони потрібні для цього.
Роберт Хендерсон

це найкраща відповідь 👍, але довелося зробити клон, тому що коли такі значення, як topicIdзмінюється, змінюється і значення в тайм-ауті. Клон зафіксував її
паріолу

10

Замініть

 setTimeout("postinsql(topicId)", 4000);

з

 setTimeout("postinsql(" + topicId + ")", 4000);

а ще краще замінити виразок рядка анонімною функцією

 setTimeout(function () { postinsql(topicId); }, 4000);

Редагувати:

Коментар Браунстона невірний, це працюватиме за призначенням, як показано, запустивши це в консолі Firebug

(function() {
  function postinsql(id) {
    console.log(id);
  }
  var topicId = 3
  window.setTimeout("postinsql(" + topicId + ")",4000); // outputs 3 after 4 seconds
})();

Зауважте, що я погоджуюся з іншими, що вам слід уникати передачі рядка, setTimeoutоскільки це зателефонує eval()на рядок і замість цього передасть функцію.


Це не буде працювати, оскільки результат postinsql (topicId) буде виконаний setTimeout. Вам потрібно загорнути його у функцію, як у першій відповіді, або скористатися таким помічником, як прототип .curry () - setTimeout (postinsql.curry (topidId), 4000);
shuckster

2
@brownstone: Це неправильно. Рядок буде оцінено під час запуску тайм-ауту.
Майлз

9

Ви можете передати параметр функції setTimeout у відповідь як:

setTimeout (функція, мілісекунд, парам1, парам2, ...)

напр.

function myFunction() {
  setTimeout(alertMsg, 3000, "Hello");
}

function alertMsg(message) {
    alert(message)
}

1
Хтось може сказати мені, чому ця відповідь не є кращою? це, на мою думку, найпростіший спосіб! Так просто, якsetTimeout( (p) => { console.log(p); }, 1000, "hi" );
Мажар Зандсалімі

1
Ага! Це має бути прийнятою відповіддю. Від MDN: developer.mozilla.org/en-US/docs/Web/API/…
Хан


5

Я знаю, що минуло 10 років з того часу, як це питання було задано, але все ж, якщо ви прокрутили тут, я припускаю, що ви все ще стикаєтеся з якоюсь проблемою. Рішення Медер Омуралієв є найпростішим і може допомогти більшості з нас, але для тих, хто не хоче мати будь-якої прив'язки, ось це:

  1. Використовуйте Param для setTimeout
setTimeout(function(p){
//p == param1
},3000,param1);
  1. Використовувати вираз негайно викликаних функцій (IIFE)
let param1 = 'demon';
setTimeout(function(p){
    // p == 'demon'
},2000,(function(){
    return param1;
})()
);
  1. Вирішення питання
function statechangedPostQuestion()
{
  //alert("statechangedPostQuestion");
  if (xmlhttp.readyState==4)
  {
    setTimeout(postinsql,4000,(function(){
        return xmlhttp.responseText;
    })());
  }
}

function postinsql(topicId)
{
  //alert(topicId);
}

4

Я знаю, що це старе, але я хотів додати цьому (бажаного) смаку.

Я думаю, що досить зрозумілим способом досягти цього є передача функції topicIdна функцію, яка, в свою чергу, використовує аргумент для внутрішнього посилання на ідентифікатор теми. Це значення не зміниться, навіть якщо topicIdзовні буде змінено незабаром після.

var topicId = xmlhttp.responseText;
var fDelayed = function(tid) {
  return function() {
    postinsql(tid);
  };
}
setTimeout(fDelayed(topicId),4000);

або коротко:

var topicId = xmlhttp.responseText;
setTimeout(function(tid) {
  return function() { postinsql(tid); };
}(topicId), 4000);

4

Відповідь Девіда Мейстера, здається, піклується про параметри, які можуть змінюватися одразу після виклику setTimeout (), але до виклику анонімної функції. Але це занадто громіздко і не дуже очевидно. Я виявив елегантний спосіб робити майже те саме, використовуючи IIFE (негайно викликаний вираз функції).

У наведеному нижче прикладі currentListзмінна передається IIFE, що зберігає її при закритті, доки не буде викликана функція затримки. Навіть якщо змінна currentListзміниться відразу після показаного коду, setInterval()воля зробить правильно.

Без цієї методики IIFE setTimeout()функція обов'язково буде викликана для кожного h2елемента в DOM, але всі ці виклики побачать лише текстове значення останнього h2 елемента.

<script>
  // Wait for the document to load.
  $(document).ready(function() {
  $("h2").each(function (index) {

    currentList = $(this).text();

    (function (param1, param2) {
        setTimeout(function() {
            $("span").text(param1 + ' : ' + param2 );
        }, param1 * 1000);

    })(index, currentList);
  });
</script>

4

Загалом, якщо вам потрібно передати функцію як зворотний виклик із певними параметрами, ви можете використовувати функції вищого порядку. Це досить елегантно з ES6:

const someFunction = (params) => () => {
  //do whatever
};

setTimeout(someFunction(params), 1000);

Або якщо someFunctionце перший порядок:

setTimeout(() => someFunction(params), 1000); 

це дуже несумісно
користувач151496

Елегантний справді! Спасибі
Velojet

3

Зауважимо, що причина topicId "не була визначена" за повідомленням про помилку полягає в тому, що вона існувала як локальна змінна під час виконання setTimeout, але не тоді, коли стався затриманий виклик до postinsql. Змінна тривалість життя особливо важлива, на яку слід звернути увагу, особливо при спробі чогось подібного передавати "це" як орієнтир на об'єкт.

Я чув, що ви можете передавати topicId як третій параметр функції setTimeout. Дано не багато деталей, але я отримав достатньо інформації, щоб змусити її працювати, і це успішно в Safari. Я не знаю, що вони мають на увазі про "помилку мілісекунди". Перевірте це тут:

http://www.howtocreate.co.uk/tutorials/javascript/timers


3

Як я вирішив цей етап?

ось так :

setTimeout((function(_deepFunction ,_deepData){
    var _deepResultFunction = function _deepResultFunction(){
          _deepFunction(_deepData);
    };
    return _deepResultFunction;
})(fromOuterFunction, fromOuterData ) , 1000  );

setTimeout зачекайте посилання на функцію, тому я створив її у закритті, яке інтерпретує мої дані та повертає функцію з гарним екземпляром моїх даних!

Можливо, ви можете вдосконалити цю частину:

_deepFunction(_deepData);

// change to something like :
_deepFunction.apply(contextFromParams , args); 

Я перевірив це на chrome, firefox та IE, і він добре працює, я не знаю про продуктивність, але мені потрібно, щоб він працював.

вибірковий тест:

myDelay_function = function(fn , params , ctxt , _time){
setTimeout((function(_deepFunction ,_deepData, _deepCtxt){
            var _deepResultFunction = function _deepResultFunction(){
                //_deepFunction(_deepData);
                _deepFunction.call(  _deepCtxt , _deepData);
            };
        return _deepResultFunction;
    })(fn , params , ctxt)
, _time) 
};

// the function to be used :
myFunc = function(param){ console.log(param + this.name) }
// note that we call this.name

// a context object :
myObjet = {
    id : "myId" , 
    name : "myName"
}

// setting a parmeter
myParamter = "I am the outer parameter : ";

//and now let's make the call :
myDelay_function(myFunc , myParamter  , myObjet , 1000)

// this will produce this result on the console line :
// I am the outer parameter : myName

Можливо, ви можете змінити підпис, щоб зробити його більш досконалим:

myNass_setTimeOut = function (fn , _time , params , ctxt ){
return setTimeout((function(_deepFunction ,_deepData, _deepCtxt){
            var _deepResultFunction = function _deepResultFunction(){
                //_deepFunction(_deepData);
                _deepFunction.apply(  _deepCtxt , _deepData);
            };
        return _deepResultFunction;
    })(fn , params , ctxt)
, _time) 
};

// and try again :
for(var i=0; i<10; i++){
   myNass_setTimeOut(console.log ,1000 , [i] , console)
}

І нарешті, щоб відповісти на початкове запитання:

 myNass_setTimeOut( postinsql, 4000, topicId );

Сподіваюся, це може допомогти!

ps: вибачте, але англійська мова - це не моя рідна мова!


Це надмірно складно, порівняно з іншими відповідями.
Дан Даскалеску

3

це працює у всіх браузерах (IE - це дивний)

setTimeout( (function(x) {
return function() {
        postinsql(x);
    };
})(topicId) , 4000);

3

якщо ви хочете передати змінну, так як парам дозволить спробувати це

якщо вимога є функцією та var як parmas, то спробуйте це

setTimeout((param1,param2) => { 
     alert(param1 + param2);
     postinsql(topicId);
},2000,'msg1', 'msg2')

якщо вимога є лише змінними як парами, то спробуйте це

setTimeout((param1,param2) => { alert(param1 + param2) },2000,'msg1', 'msg2')

Ви можете спробувати це за допомогою ES5 та ES6


2

Ви можете спробувати функціональність 'apply ()' за замовчуванням на кшталт цього, ви можете передавати більше масиву аргументів як свою вимогу в масив

function postinsql(topicId)
{
  //alert(topicId);
}
setTimeout(
       postinsql.apply(window,["mytopic"])
,500);

1

setTimeout - це частина DOM, визначена ЩО РГ.

https://html.spec.whatwg.org/multipage/timers-and-user-prompts.html

Ви бажаєте:

handle = self.setTimeout( handler [, timeout [, arguments... ] ] )

Графік тайм-ауту для запуску обробника після закінчення мілісекунд. Будь-які аргументи передаються безпосередньо обробнику.

setTimeout(postinsql, 4000, topicId);

Мабуть, додаткові аргументи підтримуються в IE10. Як варіант, ви можете використовуватиsetTimeout(postinsql.bind(null, topicId), 4000); , однак передавати додаткові аргументи простіше, і це краще.

Історичний факт: за днів VBScript, у JScript, третім параметром setTimeout була мова, як рядок, дефолт до "JScript", але з можливістю використання "VBScript". https://docs.microsoft.com/en-us/previous-versions/windows/internet-explorer/ie-developer/platform-apis/aa741500(v%3Dvs.85)


0

@Jiri Vetyska дякую за пост, але у вашому прикладі щось не так. Мені потрібно було передати ціль, яку вивісили (це), на призупинену функцію, і я спробував ваш підхід. Тестований у IE9 - не працює. Я також провів деякі дослідження, і, здається, що тут зазначено третій параметр є мова сценаріїв використовується. Немає згадки про додаткові параметри.

Отже, я переслідував відповідь @ meder і вирішив свою проблему з цим кодом:

$('.targetItemClass').hover(ItemHoverIn, ItemHoverOut);

function ItemHoverIn() {
 //some code here
}

function ItemHoverOut() {
    var THIS = this;
    setTimeout(
        function () { ItemHoverOut_timeout(THIS); },
        100
    );
}
function ItemHoverOut_timeout(target) {
    //do something with target which is hovered out
}

Сподіваюся, це корисно для когось іншого.


0

Оскільки існує проблема з третім оптональним параметром в IE, а використання закриття заважає нам змінювати змінні (наприклад, у циклі) та все-таки досягти бажаного результату, я пропоную наступне рішення.

Ми можемо спробувати використовувати рекурсію так:

var i = 0;
var hellos = ["Hello World1!", "Hello World2!", "Hello World3!", "Hello World4!", "Hello World5!"];

if(hellos.length > 0) timeout();

function timeout() {                
    document.write('<p>' + hellos[i] + '<p>');
    i++;
    if (i < hellos.length)
        setTimeout(timeout, 500);
}

Нам потрібно переконатися, що нічого іншого не змінює ці змінні, і щоб ми написали належну умову рекурсії, щоб уникнути нескінченної рекурсії.


0

// Це три дуже прості та стислі відповіді:

function fun() {
    console.log(this.prop1, this.prop2, this.prop3);
}

let obj = { prop1: 'one', prop2: 'two', prop3: 'three' };

let bound = fun.bind(obj);

setTimeout(bound, 3000);

 // or

function funOut(par1, par2, par3) {

  return function() { 

    console.log(par1, par2, par3);

  }
};

setTimeout(funOut('one', 'two', 'three'), 5000);

 // or

let funny = function(a, b, c) { console.log(a, b, c); };

setTimeout(funny, 2000, 'hello', 'worldly', 'people');

0

Відповідь на питання, але простою функцією додавання з двома аргументами.

var x = 3, y = 4;

setTimeout(function(arg1, arg2) { 
      delayedSum(arg1, arg2);
}(x, y), 1000);

function delayedSum(param1, param2) {
     alert(param1 + param2); // 7
}

0

Ви повинні видалити лапки з setTimeOutфункціонального дзвінка так:

setTimeout(postinsql(topicId),4000);

-1

Я думаю, ти хочеш:

setTimeout("postinsql(" + topicId + ")", 4000);

1
Я натрапив на випадки, коли це просто не працює (завжди призводить до помилки "функція не визначена"), але використання анонімної функції працює. Що засмучує, враховуючи, що всі, здається, говорять, що вищевказаний синтаксис повинен завжди працювати. (може бути, що jQuery якось перешкоджає методу "цитувати як рядок"?)
DA.

6
Припустимо, що topicId - це функція ... Або об'єкт. Це не вийде!
Серафеїм

Якщо ви дійсно хочете продовжити цей метод, використовуйте JSON.stringifyдля регулярних об'єктів і масиви, а потім використовуйте JSON.parseвсередині функції. Однак вся поведінка буде втрачена, якщо об’єкт має методи.
DarthCadeus

-2

// Це три дуже прості та стислі відповіді:

function fun() {
    console.log(this.prop1, this.prop2, this.prop3);
}

let obj = { prop1: 'one', prop2: 'two', prop3: 'three' };

let bound = fun.bind(obj);

setTimeout(bound, 3000);

 // or

function funOut(par1, par2, par3) {

  return function() { 

    console.log(par1, par2, par3);

  }
};

setTimeout(funOut('one', 'two', 'three'), 5000);

 // or

let funny = function(a, b, c) { console.log(a, b, c); };

setTimeout(funny, 2000, 'hello', 'worldly', 'people');
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.