1. Функциональная область
1. Функциональная область
Это означает, что область применения находится в «функции», и все переменные, принадлежащие этой функции, могут быть использованы и мультиплексированы во всей области функции.
function foo (a) {var b = 2; function bar () {// ...} var c = 3;} bar (); // неудачная консоль.log (a, b, c); // все три не удалисьЕсли будет сообщено о нескольких идентификаторах в функции «Foo», если они будут размещены вне функции и доступны.
2. немедленно выполнить выражение функции
Добавление функций обертки вне любого фрагмента кода может «скрыть» внутренние переменные и определения функций, а внешняя область не может получить доступ к функции обертки.
Например, вышеупомянутая полоса, A и другие идентификаторы. Это защитит переменную от загрязнения.
При написании плагинов вы часто используете немедленно для выполнения выражений функций для защиты переменных внутри.
var a = 2; (function foo () {var a = 3; console.log (a); // 3}) (); console.log (a); // 2Первый () в «foo» превращает функцию в выражение, а второе () выполняет эту функцию.
Существует особый термин: iife, который представляет собой немедленно вызванное выражение функции;
1. Расширенное использование - это назвать их функцией и передавать параметры в
(функция iife (global) {var a = 3; console.log (a); // 3console.log (global.a); // 2}) (window);2. Изменной целью является инвертировать порядок выполнения кода, который широко используется в проектах CMD или AMD.
(функция iife (factory) {factory (window);}) (функция def (global) {var a = 3; console.log (a); // 3console.log (global.a); // 2});2. Блок сфера
JavaScript не поддерживает сферу блока.
for (var i = 0; i <10; i ++) {console.log (i);}«I» в приведенном выше коде эквивалентен следующему
var i; for (i = 0; i <10; i ++) {console.log (i);}Но есть исключения: «Попробуйте/поймать», Catch - это прицел для блока.
try {undefined (); // выполнить незаконную операцию, чтобы заставить исключение} catch (err) {console.log (err); // может нормально выполнять! } console.log (err); // referenceerror: err не найденES6 изменил статус -кво и представил новое ключевое слово LET, которое может привязывать переменные с любой областью (обычно внутри {..}). Другими словами, переменные, объявленные за пусть неявно лежать в сфере блока.
3. Улучшение
Поведение масштаба функции и объема блока одинаково и может быть обобщено как: любая переменная, объявленная в рамках области, будет прикреплена к этой области.
1) Компиляция и исполнение
Все объявления переменных и функций будут обработаны первыми до выполнения какого -либо кода. Вы можете увидеть следующий пример кода.
a = 2; var a; console.log (a); // 2
Этот код эквивалентен:
Var A; // Объявление определения выполняется на стадии компиляции a = 2; // Объявление о назначении будет оставлено на месте, чтобы дождаться консоли выполнения.
2) Приоритет функции
Функция будет сначала продвигать, а затем будет переменная.
foo (); // 1var foo; function foo () {console.log (1);} foo = function () {console.log (2);};Экспрессия функции var foo, хотя до объявления функции foo (), является дублированным объявлением (и, следовательно, игнорируется), поскольку объявление функции будет способствовать нормальной переменной.
И приведенный выше код эквивалентен:
function foo () {console.log (1);} foo (); // 1foo = function () {console.log (2);};4. Закрытие
Закрытие относятся к функциям, которые имеют доступ к переменным в другой области функции. Наиболее распространенный способ создания закрытия - это создание другой функции в одной функции.
Доступ к локальным переменным этой функции через другую функцию, использование закрытия может прорваться через область цепочки действий и передавать переменные и методы внутри функции снаружи
Особенности закрытия:
1. Функции по своей природе вложены
2. Внутренние функции могут относиться к внешним параметрам и переменным
3. Параметры и переменные не будут собираться механизмом сбора мусора
1) Определение
Когда функция может запомнить и получить доступ к сферу, она находится, сгенерируется закрытие, даже если функция выполняется за пределами текущей области.
function foo () {var a = 2; function bar () {console.log (a);} return bar;} var baz = foo (); baz (); // 2 - это эффект закрытия.1. Назначьте функцию «Бар» на «Баз» и выполнить «Баз». Текущая область применения не в сфере «Бар», но его можно выполнить.
2. Закрытие также предотвратит сборку мусора. Когда «Foo» выполняется, внутренняя область все еще существует. Таким образом, «Баз» может быть выполнен.
2) Передайте функцию в качестве параметра
function foo () {var a = 2; function baz () {console.log (a); // 2} bar (baz);} bar (fn) {fn (); // Это закрытие! }Передайте внутреннюю функцию BAZ в стержень, и когда эта внутренняя функция называется (FN), закрытие внутреннего объема Foo (), которую она покрывает, может наблюдаться, поскольку она может получить доступ к a.
Если вы рассматриваете функцию как тип значения на первом уровне и проходите ее повсюду, вы увидите применение закрытия в этих функциях.
В таймерах, слушателях событий, запросах AJAX, общении по сшитке, веб-работникам или любым другим асинхронным (или синхронным) задачам, если используется функция обратного вызова, она на самом деле использует закрытие!
3) Петли и закрытие
for (var i = 1; i <= 5; i ++) {settimeout (функция timer () {console.log (i);}, i * 1000);}Каждый раз, когда он напечатан, это будет 6, и обратный вызов функции задержки будет выполняться только в конце цикла.
В соответствии с тем, как работает масштаб, реальность такова, что, хотя пять функций в цикле определяются отдельно в каждой итерации, все они заключены в общую глобальную область, так что на самом деле есть только один i.
Теперь используйте закрытие, чтобы реализовать различную печать I каждый раз.
for (var i = 1; i <= 5; i ++) {(function (j) {setTimeout (function timer () {console.log (j);}, j * 1000);}) (i);}IIFE создает прицелы, немедленно объявляя и выполняя функцию. Обратный вызов в Settimeout может запомнить текущую область, а параметр «j» в каждой области различен.
Выше приведено подробное объяснение наиболее запутанного масштаба, улучшения и закрытия знаний в JavaScript, которое редактор представляет вам. Я надеюсь, что это будет полезно для вас. Если у вас есть какие -либо вопросы, пожалуйста, оставьте мне сообщение, и редактор ответит вам вовремя. Большое спасибо за вашу поддержку сайту wulin.com!