Источник: https://developer.mozilla.org/ru/docs/Web/JavaScript/Guide/Functions
Функции - это один из фундаментальных строительных блоков JavaScript.Функция - это JavaScript процедура, представляющая собой набор инструкций, которые выполняют какое либо действие или вычисляют значение.
Объявление функции состоит из ключевого слова function
, далее следует:
()
разделенных запятыми (или параметров функции по другому);{}
.Пример, следующий код объявляет функцию square:
function square(number) {
return number * number;
}
Инструкция return
указывает значение возвращаемое функцией.
Параметры примитивов (например, такие как числа) передаются в функцию по значению; значение передается функции, но если функция изменит значение параметра, это изменение не будет иметь глобального эффекта.
Если вы передаете в функцию объект (непримитивное значение, такой как Array или определенный пользователем объект) как параметр, и функция изменяет свойства объекта, то эти изменения будут видимы вне функции, как продемонстрировано это в след. примере:
function myFunc(theObject) {
theObject.make = "Toyota";
}
var mycar = {make: "Honda", model: "Accord", year: 1998},
x,
y;
x = mycar.make; // x gets the value "Honda"
myFunc(mycar);
y = mycar.make; // y gets the value "Toyota"
// (the make property was changed by the function)
Метод это функция являющаяся членом объекта.
Определения функции приведенные выше являются набором синтаксической инструкцией, но функции также могут быть созданы с помощью выражения функции. Такие функции могут быть анонимными; функция не обязательно должна иметь имя. Например функция square может быть определена как:
var square = function(number) {return number * number};
Функции выражения очень удобны когда надо передать в функцию другую функцию как аргумент.
Определение функций не выполняет их. Определение функции только дает имя функции и инструкции что делать если функция будет вызвана. Вызов функции в действительности выполняет определенные действия с переданными параметрами.
square(5);
Предыдущая инструкция вызывает функцию с аргументом равным 5. Функция выполняет свои инструкции и возвращает значение 25. Функции должны быть в области видимости, когда они вызываются.
Аргументы функции не ограничены числами и строками. Вы также можете передавать объекты и функции.
Переменные определенные внутри функции невидимы вне этой функции, так как переменные определяются в области видимости внутри функции. Как бы там ни было сама функция имеет доступ ко всем переменным и другим функциям определенным в той же области видимости где и сама функция была определена. Другими словами, функция определенная в глобальной области видимости имеет доступ ко всем переменным определенным в глобальной области видимости. Функция, определенная внутри другой функции имеет доступ ко всем переменным определенным в функции родителе и любой другой переменной к которой функция родитель имеет доступ.
// The following variables are defined in the global scope
var num1 = 20,
num2 = 3,
name = "Chamahk";
// This function is defined in the global scope
function multiply() {
return num1 * num2;
}
multiply(); // Returns 60
// A nested function example
function getScore () {
var num1 = 2,
num2 = 3;
function add() {
return name + " scored " + (num1 + num2);
}
return add();
}
getScore(); // Returns "Chamahk scored 5"
Замыкания одна из самых мощных особенностей JavaScript. JavaScript позволяет наследовать функции и, вдобавок, дает полный доступ внутренним функциям ко всем переменным и функциям определенным в функции родителе (и всем переменным и функциям к которым имеет доступ функция родитель). Как бы там ни было, внешняя функция не имеет доступа к переменным и функциям определенным внутри внутренней функции. Это обеспечивает в некотором виде безопасность переменных внутренней функции.
var pet = function(name) { // The outer function defines a variable called "name"
var getName = function() {
return name; // The inner function has access to the "name" variable of the outer function
}
return getName; // Return the inner function, thereby exposing it to outer scopes
},
myPet = pet("Vivie");
myPet(); // Returns "Vivie"
Объект содержащий методы для изменения внутренних переменных внешней функции может быть возвращен.
var createPet = function(name) {
var sex;
return {
setName: function(newName) {
name = newName;
},
getName: function() {
return name;
},
getSex: function() {
return sex;
},
setSex: function(newSex) {
if(typeof newSex == "string" && (newSex.toLowerCase() == "male" || newSex.toLowerCase() == "female")) {
sex = newSex;
}
}
}
}
var pet = createPet("Vivie");
pet.getName(); // Vivie
pet.setName("Oliver");
pet.setSex("male");
pet.getSex(); // male
pet.getName(); // Oliver