Именованные функции (FunctionDeclaration)
1 2 3 4 5 6 7 8 9 |
/* функция sum нормально отработает */ var a = sum(2,2) function sum(x,y) { return x+y } |
Анонимные функции (FunctionExpression)
1 2 3 4 5 6 7 8 9 10 |
/* будет ошибка, т.к sum еще не существует */ var a = sum(2,2) var sum = function(x,y) { return x+y } |
Анонимная самовызывающаяся функция
1 2 3 4 5 6 7 8 9 10 |
/* позворяет изолировать код от глобальной видимости */ (function(){ var i=1; console.log("Анонимная самовызывающаяся функция"); })(); console.log(i); // i is not defined |
Функции – объекты
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
/* возможность передавать значение свойства в функции как в объект */ function func() { return ... } func.test = 13 alert(func.test) // 13 function func() { var funcObj = arguments.callee; // получаем объект функции со всеми методами и свойствами funcObj.test++; // обращаемся к локальной области alert(funcObj.test); } func.test = 1 func() // 2 func() // 3 |
Области видимости
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
/* локальная область видимости функции определяется фигурными скобками и объявлением var, let, const */ var x = 10; function a() { // присвоить значение локальной переменной можно до ее объявления z=5; console.log(x+z); // объявить локальную переменную можно в любой части области (она поднимется вверх) var z; } delete z // очистим на всякий случай глобальную z a() // 15 console.log(window.z) // => undefined, т.к z была задана локально |
Параметры функции
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
/* передаем функции параметры, обрабатываем и возвращаем результат */ var run = function(distance, speed) { var time; var speed = speed||10; var time=distance/speed; return time; } console.log(run(10)); // 1 console.log(run(10,5)); // 2 console.log(run(10,5,46,11)); // 2 console.log(run()); // NaN |
Неопределенным числом параметров
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
/* объект arguments содержит все аргументы с которыми вызвалась функция, при этом он поход на массив но не содержит методов присущих массиву (.push, .pop), имеет длинну в свойстве length и ссылку на саму функцию в свойстве callee */ function func() { for(vari=0;i<arguments.length;i++) { alert("arguments["+i+"] = "+arguments[i]) } } func('a','b',true) console.log(arguments[0]); // a console.log(arguments[1]); // b console.log(arguments[2]); // true |
1 2 3 4 5 6 7 8 |
/* внутри функции можно создать массив из переданных аргументов */ var args = Array.prototype.slice.call(arguments); // теперь args - настоящий массив аргументов args.shift() // удаляем первый элемент массива (function(args) { ... })(); //используем аргументы во вложенной функции |
Передача функции по ссылке
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
/* Передача функции по ссылке */ var map = function(func, arr) { var result= [ ] for(vari=0; i<arr.length; i++) { result[i] =func(arr[i]) } return result } // передаем функцию внутрь массива по ссылке function run(a) { return a*3; } console.log(map( run , [1,2,3])); // [3, 6, 9] // передаем ананимную функцию как аргумент в вызове console.log(map( function (a) { return a*3 } , [1,2,3])); // [3, 6, 9] |
Сворачивание параметров в объект
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
/* Сворачивание параметров в объект через "keyword arguments" если в функции много необязательных параметров func(1,2,null,null,true,null) */ function resize(setup) { var animate = setup.animate || true, toHeight=setup.toHeight||10, toWidth=setup.toHeight||20; ... } // передаем параметры по ключу в разном порядке resize({toWidth: 100, animate: true, toHeight: 25}) === var array = {toWidth: 100, animate: true, toHeight: 25}; resize(array); |