Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 01.01.2022, 02:05
Новичок на форуме
Отправить личное сообщение для Amonecks Посмотреть профиль Найти все сообщения от Amonecks
 
Регистрация: 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);
Ответить с цитированием
  #2 (permalink)  
Старый 01.01.2022, 12:02
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,215

Сообщение от 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.
Ответить с цитированием
  #3 (permalink)  
Старый 01.01.2022, 12:29
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,215

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);
Ответить с цитированием
  #4 (permalink)  
Старый 01.01.2022, 15:43
Новичок на форуме
Отправить личное сообщение для Amonecks Посмотреть профиль Найти все сообщения от Amonecks
 
Регистрация: 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)
Ответить с цитированием
  #5 (permalink)  
Старый 01.01.2022, 16:44
Новичок на форуме
Отправить личное сообщение для Amonecks Посмотреть профиль Найти все сообщения от Amonecks
 
Регистрация: 01.01.2022
Сообщений: 6

Я понял что если в функции ps1 как параметр указать функцию ps2, и запустить её с параметром ps1 то всё работает и что, если задать ps1 и ps2 в глобальной области видимости они так же будут запускать друг друга, но я не понимаю почему если именно указать их в параметре, то они перестают видеть друг друга(по идее же параметр копирует переданное значение в локальную переменную. Получается в функция ps1 запускается из локальной переменной, но не может запустить другую функцию из такой же переменной рядом?)
Ответить с цитированием
  #6 (permalink)  
Старый 01.01.2022, 18:00
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,215

Amonecks, все дело в области видимости JS... Такого я не встречал в других ЯП.

Даже само определение ОВ настолько лаконично что не всем дается с первого раза.
Точкой отсчета является объявление функции. Именно относительно объявления и определяются "видимые" ей переменные.
Вот иллюстрация этого
const a = 1
test(function(){alert(a)})

function test(f) {
	const a = 2
	f()
}

На момент объявления
function(){alert(a)}

Доступно лишь
const a = 1

Именно с этим значением и будет работать функция, когда ее получат как параметр в другой функции и вызовут на исполнение.
Ответить с цитированием
  #7 (permalink)  
Старый 01.01.2022, 18:59
Новичок на форуме
Отправить личное сообщение для Amonecks Посмотреть профиль Найти все сообщения от Amonecks
 
Регистрация: 01.01.2022
Сообщений: 6

Если я правильно понял, то если при объявлении функции в параметре, она не имеет данных о переменной, которая будет объявлена ниже, то она считает что переменная не объявлена? То есть в моем примере функция pos1 имеет в себе вызов функции pos2. Она при воем объявлении ищет переменную pos2, так как она запускается в ней, не находит и считает что переменной на момент создания нет, и даже если эта переменная создается позже, она уже работает с тем, что считает переменную pos2 несуществующей?
Ответить с цитированием
  #8 (permalink)  
Старый 01.01.2022, 19:10
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,109

Amonecks,
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
removeEventListener функции с параметрами -=Vovka=- Javascript под браузер 6 15.01.2017 21:13
Вопрос с параметрами функции LungDesire Общие вопросы Javascript 4 18.08.2015 16:08
Проблема с выходным значением функции sparrow Общие вопросы Javascript 4 18.01.2014 18:13
Проблема с запуском функции (Sandr) Общие вопросы Javascript 2 05.07.2011 15:30
Проблема с вызовом функции в качестве обработчика G_M_S Общие вопросы Javascript 5 03.05.2011 11:55