 
			
				01.01.2022, 02:05
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Новичок на форуме 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 01.01.2022 
					
					
					
						Сообщений: 6
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	| 
	
	
		
		
			
			 
				Проблема с параметрами функции
			 
			
		
		
		
		Доброго времени суток. Столкнулся с проблемой, что функция записанная в параметре которая вызывает другую функцию, не работает. Вот код 
function showPosition(order, pos1, pos2){
    if(order){
        pos1();    
    } else {
        pos2();  
    }
}
showPosition(true, function(){console.log('Позиция 1'); pos2();}, function(){console.log('Позиция 2'); pos1();});
Не могу понять в чем проблема, ведь по сути в функции showPosition создаются две переменные pos1 и pos2 к которым присваиваются соответствующие значения и потом они запускаются в зависимости от условия. 
Допустим если это написать отдельно:
 
function func1(){
    console.log('Один');
    function func2(){
        console.log('Два');
        func1();
    }
    func2();
}
func1();
функция вызывает вызвавшую её функцию, так же если в мою задачу передать функции не напрямую в параметре, а отдельно в переменных, то всё работает
 
function showPosition(order, pos1, pos2){
    if(order){
        pos1();
    } else {
        pos2();
    }
}
let pos1 = function (){
    console.log('Позиция 1');
    pos2();
};
let pos2 = function (){
    console.log('Позиция 2');
    pos1();
};
showPosition(true, pos1, pos2);
 
		
	
		
		
		
		
		
		
	
		
			
			
	
			
			
			
			
			
				 
			
			
			
			
			
			
				
			
			
			
		 
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				01.01.2022, 12:02
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 CacheVar 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 19.08.2010 
					
					
					
						Сообщений: 14,298
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	| 
		
			Сообщение от Amonecks
			
		
	 | 
 
	| 
		Не могу понять в чем проблема
	 | 
 
	
 
 Все дело в области видимости функции... 
 
	
 
	| 
		
			 Цитата: 
		
	 | 
 
	| 
		Область видимости функции — функция, в котором она определена, или целая программа, если она объявлена по уровню выше.
	 | 
 
	
 
 https://developer.mozilla.org/ru/doc...uide/Functions
Т.е. на момент определения твоих функций, переменные pos1 и pos2 не определены...
 
Вариант решения
 
let pos1, pos2
showPosition(
	true, 
	function pos1(f) {
		alert('Позиция 1'); 
		f(pos1);
	}, 
	function pos2(f) {
		alert('Позиция 2'); 
		f(pos2);
	}
);
function showPosition(order, pos1, pos2){
    if(order){
        pos1(pos2);    
    } else {
        pos2(pos1);  
    }
}
 
		
	
		
		
		
		
		
		
		
						  
				
				Последний раз редактировалось ksa, 01.01.2022 в 12:07.
				
				
			
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				01.01.2022, 12:29
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 CacheVar 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 19.08.2010 
					
					
					
						Сообщений: 14,298
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		Amonecks, может вот так будет более понятно... 
Такой вариант так же не будет работать. Т.к. на момент определения функций pos1 и pos2 переменные ps1 и ps2 не определены.
 
let showPosition, pos1, pos2
function showPosition(order, ps1, ps2){
    if(order){
        ps1();
    } else {
        ps2();
    }
}
function pos1(){
    console.log('Позиция 1', ps2);
    ps2();
};
function pos2(){
    console.log('Позиция 2', ps1);
    ps1();
};
showPosition(true, pos1, pos2);
 
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				01.01.2022, 15:43
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Новичок на форуме 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 01.01.2022 
					
					
					
						Сообщений: 6
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		Видимо я не могу просто понять область видимости ну или же не правильно понял как работают параметры. 
Допустим, в вашем примере:
 
let showPosition, pos1, pos2
function showPosition(order, ps1, ps2){
    if(order){
        ps1();
    } else {
        ps2();
    }
}
function pos1(){
    console.log('Позиция 1', ps2);
    ps2();
};
function pos2(){
    console.log('Позиция 2', ps1);
    ps1();
};
showPosition(true, pos1, pos2);
: 
Вы говорите когда функции pos1 и pos2 были объявлены, переменные ps1 и ps2 не были объявлены.  
Но разве это работает не так, что функции записанные как параметр, в функции в которую они записаны присваиваются в переменные, а потом запускаются в зависимости от условия. (я имею ввиду когда запускается ps1 на этот момент в основной функции уже существуют переменные ps1 и ps2 так как они записались при вызове функции showPosition)  
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				01.01.2022, 16:44
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Новичок на форуме 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 01.01.2022 
					
					
					
						Сообщений: 6
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	| 
	
	
		
		
		
		
		 Я понял что если в функции ps1 как параметр указать функцию ps2, и запустить её с параметром ps1 то всё работает и что, если задать ps1 и ps2 в глобальной области видимости они так же будут запускать друг друга, но я не понимаю почему если именно указать их в параметре, то они перестают видеть друг друга(по идее же параметр копирует переданное значение в локальную переменную. Получается в функция ps1 запускается из локальной переменной, но не может запустить другую функцию из такой же переменной рядом?) 
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				01.01.2022, 18:00
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 CacheVar 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 19.08.2010 
					
					
					
						Сообщений: 14,298
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		Amonecks, все дело в области видимости JS... Такого я не встречал в других ЯП.    
Даже само определение ОВ настолько лаконично что не всем дается с первого раза. 
Точкой отсчета является объявление функции. Именно относительно объявления и определяются "видимые" ей переменные. 
Вот иллюстрация этого
 
const a = 1
test(function(){alert(a)})
function test(f) {
	const a = 2
	f()
}
На момент объявления
 
function(){alert(a)}
Доступно лишь
 
const a = 1
 
Именно с этим значением и будет работать функция, когда ее получат как параметр в другой функции и вызовут на исполнение.  
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				01.01.2022, 18:59
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Новичок на форуме 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 01.01.2022 
					
					
					
						Сообщений: 6
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	| 
	
	
		
		
		
		
		 Если я правильно понял, то если при объявлении функции в параметре, она не имеет данных о переменной, которая будет объявлена ниже, то она считает что переменная не объявлена? То есть в моем примере функция pos1 имеет в себе вызов функции pos2. Она при воем объявлении ищет переменную pos2, так как она запускается в ней, не находит и считает что переменной на момент создания нет, и даже если эта переменная создается позже, она уже работает с тем, что считает переменную pos2 несуществующей? 
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				01.01.2022, 19:10
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 27.05.2010 
					
					
					
						Сообщений: 33,150
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		Amonecks,
    
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
 
 |  
  |