Вызов функции и передача объекта по ссылке в функциях. Повторное использование функций.
Объявление и вызов функции
Объявить функцию можно при помощи ключевого слова function, за которым следует имя функции и список её аргументов, разделённых запятой и заключённый в скобки.
function funcName(arg1, arg2, /*... */ argN){
// dosomething
}
Любая ветка кода функции может содержать инструкцию return, которая прекращает выполнение функции. Указанное после этой инструкции значение возвращается функцией.
function sum(a, b){ return a + b; } alert(“sum(1,2)”); // 3 |
Если же при вызове функции выполненная в ней ветвь кода не содержала ключевого слова return, то функция возвращает специальное значение undefined.
function f(){} alert(“f()”); // undefined |
Способы вызова функций
Вызов функции как функции
пример
functionmyFunction(a, b) {
return a * b;
}
myFunction(10, 2); // myFunction(10, 2) will return 20
Когда функция вызывается без объекта владельца, значение this (ключевого слова) становится глобальным объектом.
В веб-браузере глобальным объектом является окно браузера.
Этот пример возвращает объект окна в качестве значения, this:
Пример
functionmyFunction() {
return this;
}
myFunction(); // Will return the window object
Вызов функции как метода
В JavaScript вы можете определить функцию в качестве методов объекта.
В следующем примере создается объект (myObject), с двумя свойствами (firstName и lastName) и способ (fullName):
Пример
varmyObject = {
firstName:"John",
lastName: "Doe",
fullName: function () {
return this.firstName + " " + this.lastName;
}
}
myObject.fullName(); // Will return "John Doe"
Вызов функции в качестве метода объекта, вызывает значение this, в качестве самом объекта с помощью this тело функции ссылается на объект
Функция получает неявный аргумент- объект относительно которого была вызвана.
Вызов функции с помощью функции конструктора
Если вызов функции предшествует с new ключевым словом, он является конструктором вызова.
Похоже, вы создаете новую функцию, но поскольку функции JavaScript являются объектами, вы на самом деле создаете новый объект:
Пример
// This is a function constructor:
function myFunction(arg1, arg2) {
this.firstName = arg1;
this.lastName = arg2;
}
// This creates a new object
var x = new myFunction("John","Doe");
x.firstName; // Will return "John"
Конструктор вызов создает новый объект. Новый объект наследует свойства и методы от своего конструктора.
this ключевое слово вконструктор не имеет значения.
Значением this будет новый объект, созданный при вызове функции.
Вызов функции спомошщью методом функций call() и apply()
В JavaScript функции являются объектами. В JavaScript функции имеют свойства и методы.
call() и apply() предопределенные методы функции JavaScript. Оба метода могут быть использованы для вызова функции, и оба метода должны иметь объект владельцем в качестве первого параметра.
Пример
functionmyFunction(a, b) {
return a * b;
}
myObject = myFunction.call(myObject, 10, 2); // Will return 20
Пример
functionmyFunction(a, b) {
return a * b;
}
myArray = [10, 2];
myObject = myFunction.apply(myObject, myArray); // Will also return 20
Оба метода принимают объект владельца в качестве первого аргумента. Единственное отличие состоит в том, что call() принимает аргументы функции по отдельности, и apply() принимает аргументы функции в массиве.
В JavaScript строгом режиме, первый аргумент становится значением this в вызываемой функции, даже если аргумент не является объектом.
В "нестрогой" режиме, если значение первого аргумента равно нулю или не определено, оно заменяется глобальным объектом.
С помощью call() или apply() вы можете установить значение this, и вызывать функцию как новый метод существующего объекта.
Передача аргументов по ссылке и по значению
Функции в JavaScript - это объекты. А объекты в JavaScript копируются по ссылке - это значит, что если у нас есть две переменные с одной и той же функцией - в них не лежит копия этой функции, а обе эти переменные ссылаются на одну и ту же функцию:
Передача в качестве аргумента функции значения по ссылке означает, что изменения, произведённые со значением аргумента в функции сохранятся после вызова функции. В этом случае в функцию передаётся ссылка и она, фактически, получает прямой доступ к области памяти, где хранится переменная.
Передача в качестве аргумента функции переменной по значению означает, что изменения,произведённые со значением этой переменной не сохраняться после вызова функции. В этом случае в функцию передаётся копия переменной.
В JavaScript нельзя задать каким образом значение будет передаваться в функцию, но важно запомнить, что ссылочные типы данных (массивы и объекты) передаются по ссылке, а примитивные (числа, строки и логические значения) передаются по значению.
Рассмотрим код, который иллюстрирует передачу значения по ссылке.
varpfun = sum; //Присваиваем ссылку на функцию
varres = pfun(1,3); //Вызываем функцию sum
function sum(arg1, arg2){
return arg1+arg2;
} |
После такого присвоения функцию можно вызвать, используя в качестве имени функции имя переменной.
Функцию можно вызывать столько раз- сколько нужно- по имени.
functionfunc() {
return '!';
});
alert(func()); //результат
func();