Created by
"Really understanding functions in JavaScript is the single most important weapon you can wield""Secrets of the JavaScript Ninja"
Палачинки (с мляко)vs.
Палачинки (с вода)
function <име>( <списък параметри> ) {
<тяло на функцията>
}
<име><списък параметри><тяло на функцията>;'
//функцията няма параметри
function signOutMsg(){
confirm("Прекратяване на сесията?");
}
// функцията декларира 2 параметъра
function sum(x, y){
console.log( x + y );
}
var functionVar = function(<списък параметри>){
<тяло на функцията>
};
functionVar в която сме я съхранили.var или let.
<име на функция>(<списък аргументи>);
greet(); // извикване на функцията greet, без аргументи
greet('Ada', 'Byron'); // извикване на функцията greet с 2 аргумента
function greet(userName){
console.log(`Hello ${userName}. Nice to see you.`);
}
// едва при извикването ще се изпълнят действията, дефинирани във функцията
// извикване на функцията greet() с аргумент "Ada"
greet("Ada");
// извикване на функцията greet() с аргумент "John"
greet("John");

// декларация на функцията sum():
function sum(x, y){
// let x = 2, y = 3; => това се прави от JS интерпретатора при извикването на функцията
console.log( x + y);
}
// извикване на функцията sum():
sum(2, 3); // 5
function sum(x, y){
// var x = 2, y = undefined;
console.log( x + y);
}
sum(2); // NaN
function sum(x){
// var x = 2;
console.log( x ); // 2
console.log( x + y); // ReferenceError: y is not defined
// ако не използваме y във функцията, няма да има грешка.
}
sum(2, 3);
return, то функцията връща undefined!return.funcName() е операция (expression, както 2+2), която винаги връща стойност.
function funcName(){
// some code
return <израз>; // exit
}
let res = funcName();
return се излиза от тялото на функцията. Тоест, нито един израз във функцията, след return няма да се изпълни! .
function f(){
console.log("start");
return true;
console.log("end"); // никога няма да се изпълни!
}
f();
// "start"
function f(){
console.log("start");
return true;
console.log("end"); // никога няма да се изпълни!
}
f();
let и const), разгледан в следващите слайдове.
// x is defined in global scope
let x = 5;
function foo() {
// y is defined in local for 'foo()' scope
let y = 10;
console.log(`x in foo: ${x}`); // x in foo: 5
console.log(`y in foo: ${y}`); // y in foo: 10
}
foo();
console.log(`x in global: ${x}`); // x in global: 5
console.log(`y in global: ${y}`); // ReferenceError: y is not defined
var x = 1
// x е глобална променлива
var x = 5;
<body>
<!-- ... -->
<script type="text/javascript" src="lib.js"></script>
<script type="text/javascript">
console.log(`x = ${x}`)
// x = 5
</script>
</body>
function f(){
// firstName e локална за f():
var firstName = "ada";
console.log( firstName );
}
f(); // "ada"
console.log( firstName ); // ReferenceError: firstName is not defined
var firstName = "Ada";
function foo(){
var firstName = "Turing"
console.log("foo() firstName: ", firstName);
}
foo(); // "Turing"
console.log("global firstName: ", firstName); // "Ada"
Локалната променлива firstName не променя стойността на глобалната променлива firstName!
За JavaScript това са 2 отделни променливи!
Внимавайте за следният възможен бъг:
var firstName = "Ada";
function foo(){
// тук променяме глобалната променлива!!!
firstName = "Turing"
console.log("foo() firstName: ", firstName);
}
foo();
console.log("global firstName: ", firstName);
firstName в тялото на функцията НЕ Е декларирана чрез var/let или const и така тя се счита за глобална променлива!
let, const и varlet, const и varlet/const vs. var: scopingblock scope за променливи дефинирани чрез ключовите думи let и constblock е всяка част от кода между { и }
{
var x = 2; // x e глобална променлива
let y = 4; // y e видима само в текущия блок
const alpha = 2.34; // alpha e видима само в текущия блок
}
console.log(`x=${x}`); // x=2
console.log(`y=${y}`); // error: y is not defined
console.log(`alpha=${alpha}`); // error: alpha is not defined
let/const vs. var: scoping - пример
let status = "none",
userAge = 32;
if(userAge>=18){
//тук не променяме глобалната променлива status, а създаваме нова променлива видима единствено в този блок
let status = "Adult"
};
console.log(`status = ${status}`);
// status = none
let/const vs. var: redeclaringlet/cont и var е че ако една променлива вече е декларирана, то при повторна декларация (redeclaring) в съшия скоуп чрез let или const ще възникне грешка.var не би възникнала грешка.let/const за деклариране на променливи, вместо var!constconst създаваме променливи, които не бихме искали да ре-дефинираме по погрешка..
const GOLDEN_RATIO = 1.618;
GOLDEN_RATIO = 2; //TypeError: Assignment to constant variable.
const задължително трябва да бъде инициализирана:
const GOLDEN_RATIO; // SyntaxError: Missing initializer in const declaration
constconst не гарантира създаването на константи в буквалния смисъл. А единствено, че при опит за re-assign ще възникне грешка!const променливата е съставна, т.е обект, то ние можем да променим някое негово пропърти без да възникне грешка.
const someArray = [3.14];
// тук не re-assign-ваме променливата someArray, а променяме стойност в самия масив
someArray[0] = 99;
console.log( someArray[0] ); // 99
const someObject = {
"pi": 3.14,
}
// тук не re-assign-ваме someObject, а променяме пропърти в самия обект:
someObject.pi = 4;
console.log( someObject.pi ); // 4
// тук правим опит за re-assign:
someArray = 4; // TypeError: Assignment to constant variable.
someObject = {}; // TypeError: Assignment to constant variable.
var foo = function(){
console.log("I am foo!");
}
foo();
// "I am foo!"
let foobar = [
function () {
console.log(`Foo`);
},
function () {
console.log(`Bar`);
}
]
foobar[0](); // 'Foo'
foobar[1](); // 'Bar'
function caller(callback){
console.log("caller will call the callback:")
callback();
}
function callback1(){
console.log("I'm the callback1 function!")
}
function callback2(){
console.log("I'm the callback2 function!")
}
caller(callback1);
caller(callback2);
function caller(f){
console.log("1")
f();
}
function callback(){
console.log("2")
}
console.log("Feeding the caller() with function declaration")
caller( callback );
console.log("Feeding the caller() with function execution")
caller( callback() );
function foo(){
return function(){
console.log(`I'm the returned function`);
}
}
foo()();
// foo()() е концептуално еквивалентно на:
// var bar = foo();
// bar();
// JavaScript "знае" за съществуването на x, тъй като декларацията "var x;" вече се е изпълнила! Но не и израза, чрез който записваме 10 в x.
console.log("x:", x); // undefined
var x;
x = 10;
// Примерът е аналогичен на горния!
console.log("x:", x); // undefined
var x = 10; // тук имаме декларация, която се е изпълнила в началото и израз, който се изпълнява сега.
// foo() вече е декларирана и JS знае, че е функция!
console.log( foo() );
function foo() {
return "I am foo() and I work!";
}
// foo() вече е декларирана, но JS не знае все още че е функция!
console.log( foo() ); //TypeError: foo is not a function
var foo = function(){
return "I am foo() and I work!";
}
(f(){})()
(function(){
console.log("I am in nowhere, but I exist and work!");
})();
// "I am in nowhere, but I exist and work"
(function(){
// нито една от променливите създадени чрез var или let, няма да бъде видима извън тази функция:
var x = 42;
console.log(`x in IIFE.js: ${x}`);
})()
See the Pen Function Definitions by Iva Popova (@webdesigncourse) on CodePen.
See the Pen Scope & Shadowing by Iva Popova (@webdesigncourse) on CodePen.
See the Pen JS variables shadowing by Iva Popova (@webdesigncourse) on CodePen.
See the Pen Calculate Rectangle Area - Task by Iva Popova (@webdesigncourse) on CodePen.
See the Pen logArrayEvenElements() Example by Iva Popova (@webdesigncourse) on CodePen.
See the Pen sumArrays by Iva E. Popova (@ProgressWWWCourses) on CodePen.
See the Pen findMaxEven() Task by Iva Popova (@webdesigncourse) on CodePen.
See the Pen HW: Max/Min student score by Iva Popova (@webdesigncourse) on CodePen.
See the Pen HW: SumEvenArrayElements by Iva Popova (@webdesigncourse) on CodePen.
See the Pen gameBoardDataStructure by Iva Popova (@webdesigncourse) on CodePen.
See the Pen autoChangeColor by Iva Popova (@webdesigncourse) on CodePen.
These slides are based on
customised version of
framework