1. Введение
С углублением js постепенно может стать любопытно.После столь долгого использования js вы не знаете, как этот js исполняется в браузере.Это смущает, ха-ха. Поэтому я ознакомился со множеством материалов, чтобы обобщить процесс выполнения JS, а также поделился ими, чтобы изучить их с вами.
В этой статье в основном говорится об однопоточном JS.
Используемые существительные: движок JS, один поток, стек выполнения, контекст выполнения.
2. JS-движок
Движок JS — важная часть браузера, в основном используемая для чтения и выполнения js. Именно этот парень выполняет js, но он не останавливается на выполнении js.
JS-движки основных браузеров:
| браузер | JS-движок |
|---|---|
| Chrome | V8 |
| Firefox | SpiderMonkey |
| IE | Чакра |
| Safari | Nitro/JavaScript Core |
| Opera | Carakan |
Хотя JS-движок каждого браузера отличается, их механизм выполнения JS примерно одинаков.
3. Выполнение JS однопоточное
Однопоточность означает, что когда движок Js выполняет Js, для его выполнения выделяется только один поток, то есть он является однопоточным при выполнении Js.
Первое популярное понимание темы
- Некоторым может быть интересно, что такое нить?
Приведу наглядный пример: если вы открываете браузер (приложение), то браузер — это процесс. После открытия браузера есть много дел (различное разделение труда): отправка запросов, прием запросов, отрисовка страниц, выполнение js и т. д. Это все потоки.
Я просто кратко говорю об этом здесь, вы можете найти информацию об операционной системе компьютера для более глубокого изучения.
Почему Js однопоточный?
- Могут возникнуть сомнения, зачем выполнение js должно быть однопоточным, если многопоточность не может выполняться быстрее?
Это восходит к истории Js. Брат Брендан Эйх создал js за 10 дней. Для чего в то время использовался js, простое взаимодействие с браузером, проверка и манипулирование dom? Почему он разработан таким сложным, и если есть несколько потоков, в работе с DOM возникнут проблемы.Предположим, один поток читает данные узла DOM, а другой поток удаляет этот узел DOM, да, да. Поэтому достаточно одного потока js, то есть он выполняется последовательно шаг за шагом.
Докажите, что выполнение js является однопоточным
Один поток может выполняться только один за другим, поэтому выполнение следующего кода вызовет блокировку (существует бесконечный цикл while), и приветствие не появится.
while(1){}
alert('hello');
В-четвертых, стек выполнения
Чтобы реализовать единый поток выполнения js, движок js поддерживает стек выполнения. (первым пришел, последним ушел)
Вот пример: что делает стек выполнения при запуске этого кода.
//运行代码
sayHello();
function sayHello(){
var message = getMessage();
console.log(message);
}
function getMessage(){
return 'hello';
}
Выполнить симуляцию кода стека
//执行栈
var exeStack = [];
//先压如全局执行环境
exeStack.push('globalContext');
//遇到执行sayHello函数,ok,压进去
exeStack.push('sayHello');
//执行sayHello函数发现,还有个getMessage函数,ok,压进栈
exeStack.push('getMessage');
//执行完了getMessage函数,弹栈
exeStack.pop();
//继续执行sayHello函数,又发现有console.log这个家伙,ok,你进栈
exeStack.push('console.log');
//执行了console后,输出hello,console 弹栈
exeStack.pop();
//这时sayHello执行完,弹栈
exeStack.pop();
//最后整个代码执行完,全局环境弹栈
exeStack.pop();
Схема стека выполнения:
В основном это общий процесс js во время выполнения, но вам может быть интересно, что именно содержит часть (абстрактных) вещей, помещенных в стек?
Что я могу вам сказать, так это то, что контекст выполнения, global относится к глобальному контексту выполнения, а остальные являются контекстом выполнения функции.Я напишу в следующей статье, что эти контексты содержат.
V. Резюме
Эта статья в основном посвящена тому, что такое однопоточность js и как реализовать однопоточность. У меня есть представление об общем процессе выполнения js, и я объясню его далее. Как экскаватор, копай глубоко.
Если вам трудно, возможно, вы делаете успехи