Проблема с параметрами функции
Доброго времени суток. Столкнулся с проблемой, что функция записанная в параметре которая вызывает другую функцию, не работает. Вот код
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); |
Цитата:
Цитата:
Т.е. на момент определения твоих функций, переменные 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); } } |
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); |
Видимо я не могу просто понять область видимости ну или же не правильно понял как работают параметры.
Допустим, в вашем примере: 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) |
Я понял что если в функции ps1 как параметр указать функцию ps2, и запустить её с параметром ps1 то всё работает и что, если задать ps1 и ps2 в глобальной области видимости они так же будут запускать друг друга, но я не понимаю почему если именно указать их в параметре, то они перестают видеть друг друга(по идее же параметр копирует переданное значение в локальную переменную. Получается в функция ps1 запускается из локальной переменной, но не может запустить другую функцию из такой же переменной рядом?)
|
Amonecks, все дело в области видимости JS... Такого я не встречал в других ЯП. :)
Даже само определение ОВ настолько лаконично что не всем дается с первого раза. Точкой отсчета является объявление функции. Именно относительно объявления и определяются "видимые" ей переменные. Вот иллюстрация этого const a = 1 test(function(){alert(a)}) function test(f) { const a = 2 f() } На момент объявления function(){alert(a)} Доступно лишь const a = 1 Именно с этим значением и будет работать функция, когда ее получат как параметр в другой функции и вызовут на исполнение. |
Если я правильно понял, то если при объявлении функции в параметре, она не имеет данных о переменной, которая будет объявлена ниже, то она считает что переменная не объявлена? То есть в моем примере функция pos1 имеет в себе вызов функции pos2. Она при воем объявлении ищет переменную pos2, так как она запускается в ней, не находит и считает что переменной на момент создания нет, и даже если эта переменная создается позже, она уже работает с тем, что считает переменную pos2 несуществующей?
|
Amonecks,
:yes: |
Часовой пояс GMT +3, время: 14:53. |