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
и var
let
, const
и var
let/const
vs. var
: scopingblock scope
за променливи дефинирани чрез ключовите думи let
и const
block
е всяка част от кода между {
и }
{
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
!const
const
създаваме променливи, които не бихме искали да ре-дефинираме по погрешка..
const GOLDEN_RATIO = 1.618;
GOLDEN_RATIO = 2; //TypeError: Assignment to constant variable.
const
задължително трябва да бъде инициализирана:
const GOLDEN_RATIO; // SyntaxError: Missing initializer in const declaration
const
const
не гарантира създаването на константи в буквалния смисъл. А единствено, че при опит за 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