Анонимные функции и замыкания
Tarasov, Lesson 8, Basic
by shurikation
JavaScript
/* Два способа объявления функции*/
// ***1. Function declaration: ***//
myFunc(); // Такую Функцию можно вызвать еще до объявления
function myFunc() {
console.log("hi");
}
myFunc();
// Такую функцию можно вызвать везде
// Ее можно вызвать до объявления почему? Когда мы через декларейшон работаем, js сначала читает весь скрипт - и еще до выполнения какой-либо строки кода интерпретатор дж создает все функции с декларейшеном, сразу создаст и будет знать где они находятся и как к ним обратится
//Такая функция как бы тоже кладется в переменную, крепится к глобальному объекту window
//Более того и переменная var крепится к глобальному объекту window
console.log(num); //undefined т.к. переменную-то он создал уже, а 5 в нее еще не положил
var num = 5;// Также js-интерпритатор создает все переменные с var
console.log(num);//5
// Итог: интерпритатор создает все функции, объявленные декларейшеном и все переменные с var сразу.
//Но с ***let*** это не работает!
//let не создаются заранее, в отличие от var, а создаются там, где и были объявлены. let нельзя вызвать до ее объявления, иначе ошибка. И это правильное поведение
//****2. Function expression:*****//
const myFuncExp = function() {
console.log('Hello!');
};// - обязательно в экспрешн ставим точку с запятой, как с переменной
//Такую функцию нельзя выполнить заранее - ошибка is not defined
//Почему? Переменная создается позже, и мы еще туда ничего не положили. Такие функции вызываются только после объявления.
const myNewFunc = myFuncExp; //неважно как была объявлена функция myFuncExp 1 или 2 способом
//Мможно так:
const myNewFunc = myFuncExp(); // но здесь сначала бы вызвалась функция myFuncExp(), мы бы по ней прошлись и на ее место пришло то, что она вернула бы или undefined;
//Функция образована от объекта, поэтому здесь:
const myNewFunc = myFuncExp; //мы просто копируем ссылку, обе переменные ссылаются на одну и ту же функцию
const game = {
position: 1,
error: this.poisition, //так this делать...