Конспект JS-course

MDN Функции

Источник: https://developer.mozilla.org/ru/docs/Web/JavaScript/Guide/Functions

Функции - это один из фундаментальных строительных блоков JavaScript.

Функция - это JavaScript процедура, представляющая собой набор инструкций, которые выполняют какое либо действие или вычисляют значение.

Объявление функций

Объявление функции состоит из ключевого слова function , далее следует:

  1. Имя функции;
  2. Список аргументов функции, в скобках вида ()разделенных запятыми (или параметров функции по другому);
  3. Инструкции JavaScript которые и составляют тело функции обрамляются, скобками вида {}.

Пример, следующий код объявляет функцию 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