1.Затваряне

Затварянето ви дава достъп до обхвата на външна функция от вътрешна функция (лексикална среда)

Пример:

function init() {
   var name = ‘John-Mayer’;
   function displayName() {
      alert(name);
  }
  displayName();
}
init();

Прочетете този официален блог за подробен отговор: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Closures

2.Прототипи в Javascript

С ES6 очевидно може да се използва функция за разширяване за наследяване. Въпреки това, под капака той все още използва прототипно наследяване.

Един пример би помогнал по-добре за разбирането на тази функция:

// Create a function
function Person(first, last, age, gender, interests) {
  
    this.name = {
      ‘first’: first,
      ‘last’ : last
    };
   this.age = age;
   this.gender = gender;
}
// Create two objects of type Person
let p1= new Person(‘John’, ‘Mayer’, 42, ‘male’, [‘music’, ‘skiing’]);
let p2= new Person(‘Pearl’, ‘Jam’, 52, ‘male’, [‘music’, life’]);

Ами сега, ако искате да добавите нов метод с име „singing“ към обекта Person, така че двата вече създадени обекта p1 и p2 да могат да използват новия метод „singing“

Ние го правим, използвайки свойство на прототип -

Person.prototype.singing = function() {
   alert(this.name.first + ‘ is the best guitarist!’);
};

Сега можем да извикаме метод за пеене в p1 или p2 обект.

p1.singing();

методите, добавени към прототипа, са достъпни за всички екземпляри на обекти, създадени от конструктора.

3.Повдигане

Повдигането е поведението по подразбиране на JavaScript за преместване на декларации в горната част, т.е. променлива може да се използва, преди да е била декларирана. Ключовото нещо, което трябва да запомните е — само декларациите се преместват в горната част, а не инициализациите.

Пример -

console.log(s) // s has not been initialized or declared will result in s is not defined error
console.log(s) // results in undefined error because var s is moved to top while initialization s = 6 is still the bottom line
var s = 6

4. setTimeOut изход

Какъв ще бъде резултатът от кода по-долу?

for (var i = 0; i < 3; i++) {
   setTimeout(function() {
      alert(i);
    }, 1000 + i);
}

Какъв е резултатът от следния код?

Би било 3,3,3

Обяснение: Този изход, който виждаме, е поради затваряния — където вътрешна функция има достъп до променливите, дефинирани във външния обхват.
Вторият параметър във функцията setTimeout е броят секунди, след които ще се изпълни вътрешното тяло за setTimeout. for цикълът се изпълнява за i=0,1 и 2 — когато i = 3, условието за for цикъл е неуспешно и цикълът не се изпълнява. Цикълът for се изпълнява в рамките на 1 секунда и в края стойността на i = 3. Кодовият блок setTimeOut се изпълнява след 1, 1,1 и 1,2 секунди — всички те се опитват да отпечатат стойността на i, която е 3, тъй като цикълът for има вече е изпълнено.

5. Строг режима

Строгият режим променя някои предварително приети грешки в грешки в js. („използвайте строго“)

Пример:

‘use strict’;
delete Object.prototype; // throws a TypeError

Същата част от кода, когато се изпълнява без строг режим, връща false

6. == и === разлика

== проверява дали стойността съвпада, докато === също проверява за типовете на променливите

7. предаване по стойност или предаване по препратка

Винаги се предава по стойност, но за обектите стойността на променливата е препратка.

Пример 1 (Извикване по стойност) :

var a = {
   “singer”:”John Mayer”
}
console.log(a.singer) // will print John Mayer
// Again initialize new value to variable a
a = {
   “singer”:”Pearl Jam”
}
console.log(a.singer) // will print Pearl Jam

Пример 2 (Обаждане чрез препратка) :

var a = {
   “singer”:”John Mayer”
}
var b = a;
b.singer = “Pearl Jam”
console.log(a.singer) // will print Pearl Jam because members of an object have been changed and the two objects a and b had the same reference, so the change persists.

8. обадете се, кандидатствайте, подвържете

Както знаем, управлението на обхвата в javascript е сложно и объркващо — така че трябва да използваме различни начини за обвързване на обекта с методите

  1. call — Използва се за обвързване на обект към метода, така че когато тази ключова дума се препраща вътре във функция, тя може да сочи към предадения обект.
  2. apply — Подобно на call — само стойностите се предават като масив, а не като отделни параметри.
function add(c, d) {
   return this.a + this.b + c + d;
}
var o = {a: 1, b: 3};
add.call(o, 5, 7); // 16
add.apply(o, [10, 20]); // 34

3. bind — Създава нова функция, където използването на тази ключова дума се отнася до стойността, предадена като параметър за свързване. При bind методът не се извиква веднага, той може да бъде извикан по-късно, когато се създаде нова функция, докато при apply и bind методът се извиква незабавно.

function f() {
   return this.a;
}
var g = f.bind({a: ‘vvk’});
console.log(g()); // vvk

Последните 2 въпроса тук са обсъдени в отделни статии и обикновено се задават като JS въпроси за напреднали.

9. Отстраняване на грешки в JavaScript приложения в chrome

https://vivek-sinless.medium.com/debugging-javascript-applications-on-chrome-4022f9fe7808

10. Сигурност в JavaScript

https://vivek-sinless.medium.com/security-in-javascript-applications-37ae3cfbf184