Недавно изучил некоторые основные концепции от FrontendMasters. Мы можем получить бесплатную подписку на 6 месяцев в FrontendMasters, используя github student developer pack.
1. Принципы JavaScript
Процесс — это программа, которая выполняет только один поток кода. Проходит код построчно и выполняет каждую строку за раз. Другими словами, одновременно обрабатывается только одна команда.
2. Обратные вызовы и функции высшего порядка
В JavaScript функции — это объекты первого класса, которые рассматриваются как объекты, и мы можем передавать их в качестве аргументов в функции.
function copyArrayAndManipulate(array, instructions) { const output = []; for (let i = 0; i < array.length; i++) { output.push(instructions(array[i])); } return output; } function multiplyBy2(input) {return input * 2;} const result = copyArrayAndManipulate([1, 2, 3], multiplyBy2);
Внешняя функция, которая принимает функцию, является нашей функцией высшего порядка.
function copyArrayAndManipulate(array, instructions) { const output = []; for (let i = 0; i < array.length; i++) { output.push(instructions(array[i])); } return output; }
Функция, которую мы вставляем, является нашей функцией обратного вызова.
function multiplyBy2(input) {return input * 2;}
3. Закрытие (область действия и контекст выполнения)
Когда наши функции вызываются, мы создаем живое хранилище данных (локальная память/переменная среда/состояние) для контекста выполнения этой функции.
function outer (){ let counter = 0; function incrementCounter (){ counter ++; } return incrementCounter; } const myNewFunction = outer(); myNewFunction(); myNewFunction();
Когда функция определена, она получает связь с окружающей локальной памятью («переменная среда»), в которой она была определена.
Мы возвращаем код incrementCounter (определение функции) из внешнего в глобальный и даем ему новое имя — myNewFunction.
Мы поддерживаем связь с активной локальной памятью external — она «возвращается», присоединяясь к задней части определения функции incrementCounter.
Таким образом, локальная память внешнего объекта теперь хранится прикрепленной к myNewFunction, даже несмотря на то, что контекст выполнения внешнего объекта давно исчез.
Когда мы запускаем myNewFunction в глобальном масштабе, сначала он будет искать в своей собственной локальной памяти (как мы и ожидали), а затем в «рюкзаке» myNewFunction.
4. Обещания, асинхронный JavaScript и цикл событий
I. Функция асинхронности, делающая возможными динамические веб-приложения.
II. Обещания — самая важная функция ES6
function display(data){ console.log(data) } const futureData = fetch('https://twitter.com/will/tweets/1') futureData.then(display); console.log("Me first!");
Синтаксис обещания
let myPromise = new Promise(function(myResolve, myReject) { // "Producing Code" (May take some time) myResolve(); // when successful myReject(); // when error }); // "Consuming Code" (Must wait for a fulfilled Promise) myPromise.then( function(value) { /* code if successful */ }, function(error) { /* code if some error */ } );
Асинхронный синтаксис
Ключевое слово await
можно использовать только внутри функции async
.
Ключевое слово await
заставляет функцию приостановить выполнение и дождаться разрешенного обещания, прежде чем продолжить:
async function myDisplay() { let myPromise = new Promise(function(resolve, reject) { resolve("I love You !!"); }); document.getElementById("demo").innerHTML = await myPromise; } myDisplay();
III. Цикл событий — сортировка JavaScript
JavaScript имеет модель времени выполнения, основанную на цикле событий, который отвечает за выполнение кода, сбор и обработку событий, а также выполнение поставленных в очередь подзадач.
(i)Стек вызовов
JavaScript отслеживает, какая функция выполняется в данный момент (где находится поток выполнения). Запуск функции, добавление в стек вызовов. Завершение выполнения функции, JS удаляет ее из стека вызовов. Независимо от того, что находится на вершине стека вызовов, это функция, которую мы сейчас выполняем.
(ii)Веб-API
Веб-API имеет методы и свойства, которые могут расширить функциональные возможности браузера. Пример setTimeOut(), fetch(), checkValidity() и т. д.
(iii)Очередь обратного вызова и очередь микрозадач
Очередь обратного вызова — это очередь задач, которые выполняются после текущей задачи. Очередь обратного вызова обрабатывается движком JavaScript после того, как он выполнил все задачи в очереди микрозадач. Обещания JavaScript и API-интерфейс Mutation Observer используют очередь микрозадач для выполнения своих обратных вызовов.
Прочтите статью ниже для лучшего понимания.
5. Классы и прототипы (ООП)
Синтаксис класса
class UserCreator { constructor (name, score){ this.name = name; this.score = score; } increment (){ this.score++; } login (){ console.log("login"); } } const user1 = new UserCreator("Eva", 9); user1.increment();
Наследование прототипа
Все объекты JavaScript наследуют свойства и методы от прототипа:
Date
объекты наследуются отDate.prototype
Array
объекты наследуются отArray.prototype
Person
объекты наследуются отPerson.prototype
Object.prototype
находится на вершине цепочки наследования прототипов:
Объекты Date
, объекты Array
и объекты Person
наследуются от Object.prototype
.
Свойство JavaScript prototype
позволяет добавлять новые свойства в конструкторы объектов.
Синтаксис
function userCreator(name, score){ this.name = name; this.score = score; } userCreator.prototype.increment = function(){ this.score++; }; userCreator.prototype.login = function(){ console.log("login"); }; const user1 = new userCreator(“Eva”, 9) user1.increment()
__прото__
Это фактический объект, который позволяет наследовать свойства JavaScript с помощью объекта, созданного с помощью new. Каждый объект со связанным поведением имеет внутреннее свойство [[prototype]]
Синтаксис
const obj1{ getRoll:function(){ return this.roll; } } const obj2{ roll:12, __proto__:obj1 } consol,log(obj2.getRoll());
Используя __proto__, мы делаем obj1 прототипом obj2.
Прочтите статью ниже для лучшего понимания.