iillyyaa2 Posted December 20, 2011 Report Share Posted December 20, 2011 (edited) немного не корректное название темы, суть такова:..<div id='bb'></div><script>var dd = {};var xx = 0;dd.aa = function() { document.getElementById('bb').innerHTML+=xx; xx++; if (xx < 3) { setTimeout(this,1000); } else { alert(xx); } };dd.aa();</script>в this попадает ВЕСЬ объект dd, а как узнать, какое значение объекта ?как узнать aa ??или может есть другой способ ?мне нужно в случае необходимости запустить ещё раз эту функцию, и хотелось бы, что бы её имя не надо было писать самому. Edited December 20, 2011 by iillyyaa2 Quote Link to comment Share on other sites More sharing options...
0 nerv Posted December 20, 2011 Report Share Posted December 20, 2011 может подойдет arguments.callee Quote Link to comment Share on other sites More sharing options...
0 Odrin Posted December 20, 2011 Report Share Posted December 20, 2011 (edited) Функция выполняется в другом контексте, отличном от контекста, в котором задается setTimeout. Вам нужна промежуточная переменная:var dd = {};var xx = 0;dd.aa = function () { xx++; if (xx < 3) { setTimeout(obj.aa, 1000); } else { alert(xx); }};var obj = dd;dd.aa();Или так:var dd = {};var xx = 0;dd.aa = function () { xx++; var self = this; if (xx < 3) { setTimeout(function () { self.aa(); }, 1000); } else { alert(xx); }};dd.aa(); Edited December 20, 2011 by Odrin Quote Link to comment Share on other sites More sharing options...
0 iillyyaa2 Posted December 20, 2011 Author Report Share Posted December 20, 2011 (edited) Odrin, а как узнать этот aa ?код будет вставляться как универсальный в десяток функций, на ошибку связи и хотелось бы не указывать имени функцииnerv, вроде оно, и работает великолепно, то что доктор прописал ..<style>div {border:1px solid;}</style><div id='bb'></div><div id='bb2'></div><script>var dd = {};var xx = 0;dd.aa = function(dd) { document.getElementById('bb').innerHTML+=xx+'<br>'; xx++; if (xx < 5) { document.getElementById('bb2').innerHTML+=arguments[0]+'<br>'; var value = arguments[0]; var fun = arguments.callee; setTimeout(function(){fun(value);},1000); return; } else { alert(xx); } };dd.aa(77);</script>ЗЫ интересно, что в парсере code заставляет "падать" на следующую строку - '; Edited December 20, 2011 by iillyyaa2 Quote Link to comment Share on other sites More sharing options...
0 iillyyaa2 Posted December 20, 2011 Author Report Share Posted December 20, 2011 (edited) всё гуд, но блин, у меня оказалось в функцию вложена функция... как узнать родителя функции ? что то я этот факт не учёл...тоесть, в этой функции запускается анонимная функция... вот как узнать родителя этой анонимной фунции, ту, кто запустил её Edited December 20, 2011 by iillyyaa2 Quote Link to comment Share on other sites More sharing options...
0 s0rr0w Posted December 20, 2011 Report Share Posted December 20, 2011 всё гуд, но блин, у меня оказалось в функцию вложена функция... как узнать родителя функции ? что то я этот факт не учёл...тоесть, в этой функции запускается анонимная функция... вот как узнать родителя этой анонимной фунции, ту, кто запустил еёНе мучайся, используй замыкания. Quote Link to comment Share on other sites More sharing options...
0 iillyyaa2 Posted December 20, 2011 Author Report Share Posted December 20, 2011 (edited) может перед запуском анонимной функции создавать локальные переменные, которые будут видны из анонимной функции ?var value = arguments[0];var fun = arguments.callee;и уже из этой анонимной запускать так жеsetTimeout(function(){fun(value);},1000);ЗЫ проканало Edited December 20, 2011 by iillyyaa2 Quote Link to comment Share on other sites More sharing options...
0 nerv Posted December 20, 2011 Report Share Posted December 20, 2011 iillyyaa2, можно поинтересоваться, зачем Вы здесь используете обертку?setTimeout(function(){fun(value);}, 1000);может простоsetTimeout(arguments.callee, 1000);Какая вообще задача стоит? Quote Link to comment Share on other sites More sharing options...
0 iillyyaa2 Posted December 20, 2011 Author Report Share Posted December 20, 2011 iillyyaa2, можно поинтересоваться, зачем Вы здесь используете обертку?setTimeout(function(){fun(value);}, 1000);что бы передать переменную, на случай, если в функцию входит переменная, в 1 функции у меня входит, в остальных нет.иначе вроде setTimeout не принимает переменнуюможет простоsetTimeout(arguments.callee, 1000);Какая вообще задача стоит?говорю, этот таймаут внутри ещё одной функции... и видит он тогда новую функцию...пришлось объявить переменные перед той функцией и уже вызывать так.а задача... работа с api вконтакте.. в случае если ошибка, повторить запрос снова. ошибка "слишком много соединений в 1 секунду"при загрузке приложения сразу несколько запросов, на случай если будет ошибка, повторить запрос через секунду и получив данные уже сформировать страницу верно.вот примерно такая функция:var myf = {};myf.vkApi0007 = function() { var value = arguments[0]; var fun = arguments.callee; VK.api("getVariables", {key:5,count:5}, function(data){ if (data.error) { if (data.error.error_code) { if (data.error.error_code == 6) { setTimeout(function(){fun(value);},1000); return; } } } }); // тут обрабатываем данные };данная функция великолепно работает.. пробовал отправить 8 запросов, так те, что не удачные были, завершились через 1-2 секундывсё гуд! Quote Link to comment Share on other sites More sharing options...
Question
iillyyaa2
немного не корректное название темы, суть такова:
в this попадает ВЕСЬ объект dd, а как узнать, какое значение объекта ?
как узнать aa ??
или может есть другой способ ?
мне нужно в случае необходимости запустить ещё раз эту функцию, и хотелось бы, что бы её имя не надо было писать самому.
Edited by iillyyaa2Link to comment
Share on other sites
8 answers to this question
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.