Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   scope, области видимости (https://javascript.ru/forum/misc/33131-scope-oblasti-vidimosti.html)

dmitriymar 12.11.2012 12:30

Цитата:

Сообщение от dmitriymar
1 (function(){
2 function a(i){alert(i)};
3 for (var i=0;i<10;i++){
4 (function(i){
5 setTimeout(function(){a(i)},50); // типа аякс запрос и ответ через время
6 })(i);
7 }
8 })();

я дал пример как можно это сделать -обрамить анонимной функцией и в неё передать параметры -будет новый скоп где значения будут нужными -поскольку простые передаются по значению . сравнить можно с аналогичным кодом не обрамлённым .вместо таймера запрос и обработчик ответов.

beebop 12.11.2012 21:46

Все бы хорошо, но я не могу передать в callback функцию переменную i.
i все 10 раз будет равно 9

dmitriymar 13.11.2012 10:08

beebop,
Зачем передавать в колбек ?передавать нужно в обертку

beebop 14.11.2012 09:47

Я извиняюсь. Может быть я совсем дурак...
(function(){
							function myfunc(index, obj){
								var uid = parseInt((/\d+/).exec(obj.S_VKID));
								VK.Api.call('users.get', {uids: uid, fields: 'sex, photo'}, form_row);
								

								function form_row(data) {
								console.log(index);	
							        //0 1 2 5 3 4 6 7 9 10 8 11 12 13 14 16 15 17 18 21 20 19 22 23 26 24 25 27  !!!!!
							    }
							}
								for(i=0; i<queue_content.length; i++){
									(function(i){
										index = i;
										obj = queue_content[i];
										myfunc(index, obj);
									})(i);
								}
									
						})();

dmitriymar 14.11.2012 11:31

В функцию нужно забрасывать все практически - все что должно существовать в едином отдельном контексте . По русски же сказал что и запрос и колбек и ...

beebop 14.11.2012 18:54

ок, смотрите

(function(){
							
							function a(i){
								form_row();
								function form_row(data) {
									setTimeout(function(){console.log(i)},50);// типа аякс ответ 0 1 2 3 4 5 6 7 8 9
								}
							}
							
							for(var i=0; i<10; i++){
								(function(i){
									a(i);
								})(i);
							}
									
						})();

(function(){
							
							function a(i){
								VK.Api.call('users.get', {uids: uid}, form_row);
								function form_row(data) {
									setTimeout(function(){console.log(i)},50);// типа аякс ответ  4 2 3 0 1 6 5 7 8 9
								}
							}
							
							for(var i=0; i<10; i++){
								(function(i){
									a(i);
								})(i);
							}
									
						})();


Ну или если опять что не так, то можно special for dummies?


Часовой пояс GMT +3, время: 23:15.