Js передать функцию как параметр
Перейти к содержимому

Js передать функцию как параметр

  • автор:

Передача функции в качестве параметра другой функции

Ошибка возникает из-за некорректного определения. В этом коде вы определяете новую функцию mult. При этом в круглых скобках должны указываться формальные параметры, а не конкретные аргументы, как у вас. Конкретные аргументы (будь то обычное значение или функция) будут передаваться в будущем, во время вызова созданной вами функции. На стадии определения функции указывается формальный параметр на место которого будет подставлено конкретное значение во время вызова этой функции. При этом формальный параметр должен иметь обыкновенное имя, например, par, num или любое другое подходящее. Вы же в определении функции пытаетесь сделать вызов формального параметра sun(), что не имеет смысла и приводит к ошибке.

Если хотите иметь возможность передавать одну функцию в другую, то для начала эти функции нужно опередить, а затем уже передать при вызове, например так:

function sun() < var x = Math.floor(Math.random() * (4 - 1 + 1)) + 1; console.log(x); return x; >function mult(func) < var x = 5 + func(); console.log(x); >// при вызове на место формального параметра func будет // подставлен фактический аргумент-функция sun mult(sun);

Курсы javascript

Вернёт ‘numbers: 66666666666’ или ‘numbers: 11111111111’ и так далее.

Но мне нужно что бы функция каждый раз вызывалась, а не только первый раз при указание её.
Есть такой вариант, но мне он не очень нравиться:

random = function (max) < var min = 1; return Math.floor(Math.random() * (max - min) + min) >someFunction = function (num) < var someString = 'numbers: ' for (var a=0;a<=10;a++) < someString = someString + num() >console.log(someString) > someFunction(function() )

Вернёт то что нужно ‘numbers: 52524414321’

Но опять же это не удобно, так как num не всегда должно быть функцией, а может быть числом, и тогда придётся писать так:

someFunction(function() )

Вообщем хочется некой эстетики в коде

Как передать функцию в функцию js

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

const sayHello = () =>  console.log('Hello!'); >; const execFunc = (func) =>  func(); >; execFunc(sayHello); // => Hello! 

Частая ошибка, когда новички передают не саму функцию, а вызов функции. Будьте внимательны, при таком подходе, сначала вычислиться то, что мы передаём, затем это значение попадёт в функцию:

const sayHello = () =>  console.log('Hello!'); >; const execFunc = (func) =>  func(); >; execFunc(sayHello()); // => TypeError: func is not a function 

Ошибка возникает, потому что в функцию execFunc() передаётся не функция, а вызов функции sayHello() .

Js передать функцию как параметр

Строки, числа, логические значения передаются в функцию по значению . Иными словами при передаче значения в функцию, эта функция получает копию данного значения. Рассмотрим, что это значит в практическом плане:

function change(x) < x = 2 * x; console.log("x in change:", x); >let n = 10; console.log("n before change:", n); // n before change: 10 change(n); // x in change: 20 console.log("n after change:", n); // n after change: 10

Функция change получает некоторое число и увеличивает его в два раза. При вызове функции change ей передается число n. Однако после вызова функции мы видим, что число n не изменилось, хотя в самой функции произошло увеличение значения параметра. Потому что при вызове функция change получает копию значения переменной n. И любые изменения с этой копией никак не затрагивают саму переменную n. В итоге мы получим следующий вывод в консоли браузера

n before change: 10 x in change: 20 n after change: 10

Передача по ссылке

Объекты и массивы представляют ссылочные типы. То есть переменная или константы, которая представляет объект или массив, по сути хранит ссылку или иными словами указатель, которые указывают на адрес в памяти, где хранится объект. Например:

let bob =< name: "Bob" >;

Переменная bob формально хранит объект, в котором определено одно поле name. Фактически же переменная bob хранит ссылку на объект, который расположен где-то в памяти.

И ссылочные типы — объекты и массивы передаются в функцию по ссылке . То есть функция получает копию ссылки на объект, а не копию самого объекта.

function change(user) < user.name = "Tom"; >let bob =< name: "Bob" >; console.log("before change:", bob.name); // Bob change(bob); console.log("after change:", bob.name); // Tom

В данном случае функция change получает некоторый объект и меняет его свойство name. При вызове этой функции в нее передается значение переменной bob:

change(bob);

Но поскольку переменная bob представляет объект и хранит ссылку на некоторый объект в памяти, то функция change получае копию этой ссылки, которая указывает на тот же объект в памяти, что и переменная bob.

В итоге мы увидим, что после вызова функции изменился оригинальный объект bob, который передавался в функцию.

before change: Bob after change: Tom

Однако если мы попробуем переустановить объект или массив полностью, оригинальное значение не изменится.

function change(user)< // полная переустановка объекта user= < name:"Tom" >; > let bob =< name: "Bob" >; console.log("before change:", bob.name); // Bob change(bob); console.log("after change:", bob.name); // Bob

Почему здесь данные не изменяются? Потому что, как писалось выше, функция получает копию ссылки . То есть при передачи в функцию параметру user значения переменной bob:

change(bob);

Переменная bob и параметр user представляют две разные ссылки, но которые указывают на один и тот же объект.

При присвоении параметру в функции другого объекта:

user= < name:"Tom" >;

ссылка user начиначет указывать на другой объект в памяти. То есть после этого bob и user — две разные ссылки, которые указывают на два разных объекта в памяти.

То же самое касается массивов:

function change(array) < array[0] = 8; >function changeFull(array) < array = [9, 8, 7]; >let numbers = [1, 2, 3]; console.log("before change:", numbers); // [1, 2, 3] change(numbers); console.log("after change:", numbers); // [8, 2, 3] changeFull(numbers); console.log("after changeFull:", numbers); // [8, 2, 3]

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *