JavaScript
Function
Agenda
- Function
- Constructor
- Hosting
- Scope
Function
Function is a "subprogram" that can be called by code external (or internal in the case of recursion) to the function. Like the program itself, a function is composed of a sequence of statements called the function body. Values can be passed to a function, and the function can return a value.
function hello() {
return 'Hello';
}
hello() // hello
hello() // hello
function имя(параметры) {
...тело...
}
Function
function имя(параметры) {
...тело...
}
Function can have params
function hello(name) {
return 'Hello ' + name;
}
hello('Vik') // Hello Vik
hello('Arni') // Hello Arni
Function
function имя(параметры) {
...тело...
}
Function can have params
function hello(name) {
return 'Hello ' + name;
}
hello('Vik') // Hello Vik
hello('Arni') // Hello Arni
Call Function
Программный код, образующий тело функции, выполняется не в момент определения функции, а в момент ее вызова. Функции в языке JavaScript могут вызываться несколькими способами:
- как функции
- как методы
- как конструкторы
- и косвенно, с помощью их методов call и apply
function hello() {
console.log('Hello');
}
hello() // Hello
Return value
Если в функции отсутствует инструкция return, то функция возвращает undefined. Если возврат из функции происходит в результате выполнения инструкции return, возвращается значение выражения, следующего за инструкцией return, или undefined, если инструкция return не имеет выражения.
Return value
function sum (a, b) {
const sum = a + b;
}
function calc (a, b) {
const sum = a + b;
return;
}
function getSum (a, b) {
return a + b;
}
console.log(sum(1, 2)); // undefined
console.log(calc(1, 2)); // undefined
console.log(getSum(1, 2)); // 3
Local variable
-
Важное свойство функций в том, что переменные, созданные внутри функции (включая параметры), локальны внутри этой функции. Это означает, что переменные и функции будут внутри вызываемой функции будут создаваться каждый раз при вызове функции, и эти отдельные её инкарнации никак друг с другом не связаны.
Local variable
function calc (a, b) {
const sum = a + b;
return sum;
}
console.log(calc(1, 2)); // 3
console.log(sum); // <-- Error! The variable is local to the function
A variable declared inside a function is only visible inside that function
Outer variable
let userName = 'John';
function showMessage() {
let message = 'Hello, ' + userName;
console.log(message);
}
showMessage(); // Hello, John
A function can access an outer variable as well
Edit outer variable
let userName = 'John';
function showMessage() {
userName = "Bob";
let message = 'Hello, ' + userName;
console.log(message);
}
console.log(userName); // John
showMessage(); // Hello, Bob
console.log(userName); // Bob
A function can access an outer variable as well
Edit outer variable
Redeclare variable in function
let userName = 'John';
function showMessage() {
let userName = "Bob"; // переопределение локальной переменной
// в области видимости функции и присвоение значения
let message = 'Hello, ' + userName;
console.log(message); // Hello Bob
}
showMessage();
console.log( userName ); // John, переопределенная переменная userName
// в функции showMessage не доступна в не функции showMessage,
// но у нас создана переменная в глобальной области видимости
var variable
local scope via var
var userName = "Vic";
function showMessage() {
console.log(userName)
var userName = "Bob";
let message = 'Hello, ' + userName;
console.log(message);
}
showMessage(); // 'Hello, Bob'
console.log( userName ); // Vic
Declare function
Function declaration
function myVeryUsefulFunction() {
// function body
console.log('meow');
}
Function expression
var myVeryUsefulFunction = function() {
// function body
console.log('meow');
};
Function invocation
myVeryUsefulFunction(); // -> meow
Anonymous function
Function that has no name is called anonymous function.
Sometimes it is called lambda-function.
function() {
console.log('hi');
}
The difference between FD and FE
Основное отличие между Function Declaration и Function Expression - функции, объявленные как Function Declaration, создаются интерпретатором до выполнения кода. Это позволяет вызывать Function Declaration до ее объявления.
Hosting
function func1() {
function funcExample() {
return 'one';
}
return funcExample();
function funcExample() {
return 'two';
}
};
console.log(func1()) // two
function func1() {
function funcExample() {
return 'one';
}
var variable = funcExample();
function funcExample() {
return 'two';
}
return variable;
};
console.log(func1()) // two
Поднятие или hoisting — это механизм в JavaScript, в котором переменные и объявления функций, передвигаются вверх своей области видимости перед тем, как код будет выполнен.
Conditional function declaration
let test;
if (1 === 1) {
test = function() {
console.log(true);
};
} else {
test = function() {
console.log(false);
};
}
test();
Function constructor
function Animal(name) {
this.name = name
this.canWalk = true
}
let animal = new Animal('rabbit')
Любая функция, кроме некоторых встроенных, может создать объект.
Для этого ее нужно вызвать через директиву new.
Например, функция Animal в примере ниже создаст новый объект.
Function as a method
function log123() {
console.log(123);
}
var obj = {
name: 'Arni',
method: function() {
console.log('method');
}
}
obj.method();
obj.method2 = log123;
obj.method2();
Метод - это не что иное, как функция, которая хранится в виде свойства объекта.
Function as a callback
var func = function(callback) {
var name = "Nick";
return callback(name);
};
console.log( func( function(n){
return "Hello " + n;
}) );
Так же функция, может быть передана в другую функцию в качестве аргумента.
Scope
Глобальными называют переменные и функции, которые не находятся внутри какой-то функции. То есть, иными словами, если переменная или функция не находятся внутри конструкции function, то они — «глобальные».
В JavaScript все глобальные переменные и функции являются свойствами специального объекта, который называется «глобальный объект».
В браузере этот объект явно доступен под именем window.
Running
- Сначала браузер ищет в коде Function Declaration и объявления var, каждое такое объявление добавляется в глобальный объект window. Функции, объявленные как Function Declaration создаются сразу, и могут быть использованы до их объявления, а переменные - равны undefined.
- Далее начинается стадия выполнения, происходит присваивание значений переменных, когда браузер доходить до соответствующей строчки кода.
Scope Local variable
var funcExp2 = function (name) {
var test = 10;
return name;
}
funcExp2('Arni');
console.log(test); // VM112:9 Uncaught ReferenceError: test is not defined
Scope Local variable
(function() {
var x = 1;
console.log(x);
})();
(function() {
var x = 2;
console.log(x);
})();
Both variables share same name, but are different variables of different scopes.
var k = 4;
var outerScope = function() {
console.log( k ); // ???
var k = 8;
console.log( k ); // ???
var innerScope = function() {
var k = 12;
console.log( k ); // ???
};
innerScope();
console.log( k ); // ???
};
outerScope();
let k = 4;
let outerScope = function() {
console.log( k );
let k = 8;
console.log( k );
let innerScope = function() {
let k = 12;
console.log( k );
};
innerScope();
console.log( k );
};
outerScope(); // ???
Links
Examples
JS function
By Oleg Rovenskyi
JS function
- 659