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,228
|
|
Сообщение от 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,228
|
|
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,228
|
|
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,123
|
|
Amonecks,
|
|
|
|