Закрытие в JavaScript на самом деле является клише. Недавно я спрашивал о своих навыках выражения и не могу полностью их поддержать. Я сумасшедший. На обратном пути я вдруг подумал о очень простой вещи. На самом деле, когда мы занимаемся проектами, мы часто используем закрытие, но когда мы задаем вопросы, ответы часто являются ответами, которые мы часто находим. Увы, имеем ли мы дело с интервью или действительно хотим чему -то научиться, я поделюсь с вами своим собственным пониманием, и письмо неизбежно.
1. Что такое закрытие?
Книга Красного Бао говорит: «Она относится к функции, которая имеет право доступа к переменным в другой области функции».
Проще говоря, JavaScript позволяет использовать внутренние функции, то есть определения функций и выражения функций расположены в организме функции другой функции. Более того, эти внутренние функции могут получить доступ ко всем локальным переменным, параметрам и другим внутренним функциям, объявленным во внешней функции, где они находятся. Когда одна из этих внутренних функций называется вне внешней функции, содержащей их, образуется закрытие. Проще говоря, это «функция создает другую функцию внутри, и последняя функция может считывать переменные в функции выше, а последнюю функцию можно назвать« закрытие »».
2. Каково использование закрытия?
Благодаря моему обширному обзору, если мы говорим: «Используя закрытие, мы можем сделать много вещей. Например, мы моделируем объектно-ориентированный стиль кода; выразить код более элегантно и кратко; и повысить эффективность выполнения кода в некоторых аспектах», будет ли он будет чувствовать себя пустым? Будет ли это лучше? Поскольку в JavaScript нет реальной области на уровне блоков, но для того, чтобы объявить некоторые локальные переменные, которые может использовать только функция, мы будем использовать закрытие, чтобы мы могли значительно уменьшить переменные в глобальной области и очистить глобальную область.
Вот несколько примеров:
1. Анонимная функция самостоятельного выполнения
Мы знаем, что если все переменные не добавляются с помощью ключевого слова VAR, по умолчанию будет добавлено в свойства глобального объекта. Есть много недостатков в добавлении таких временных переменных в глобальный объект.
Например: другие функции могут неправильно использовать эти переменные; заставляя глобальный объект быть слишком большим и влиять на скорость доступа (потому что значение переменной необходимо пройти из цепи прототипа).
В каждый раз, когда мы используем переменную, мы используем ключевое слово var. В реальных ситуациях мы часто сталкиваемся с ситуацией, когда некоторые функции должны выполняться только один раз, а их внутренние переменные не нужно поддерживать.
Например, при инициализации пользовательского интерфейса мы можем использовать закрытие:
var data = {table: [], tree: {}}; (function (dm) {for (var i = 0; i <dm.table.rows; i ++) {var row = dm.table.rows [i]; for (var j = 0; j <row.cells; i ++) {drawcell (i, j);}}}) (data);Мы создаем анонимную функцию и немедленно выполняем ее. Поскольку внешний не может ссылаться на переменные внутри него, ресурс будет выпущен сразу после выполнения функции. Ключ не в том, чтобы загрязнять глобальный объект.
2. Кэш результата
Мы столкнемся с многими ситуациями в разработке. Представьте, что у нас есть очень трудоемкий объект функции, который занимает много времени для обработки каждого вызова. Тогда нам нужно сохранить рассчитанное значение. При вызове этой функции мы сначала смотрим в кэше. Если его нельзя найти, мы выполним вычисления, а затем обновим кэш и вернем значение. Если это найдено, мы можем напрямую вернуть найденное значение. Закрытие делает именно это, потому что оно не выпускает внешние ссылки, так что значения внутри функции могут быть сохранены.
var cachedsearchbox = (function () {var cache = {}, count = []; return {attlesearchbox: function (dsid) {if (dsid in cache) {// Если результат находится в кэше возврата [dsid]; // return obyt in the cache} var fsb = new uikit.webcr CACH [DSID] = FSB; // Обновление кэш if (count.length> 100) Cachedsearchbox.attachsearchbox ("input");Таким образом, мы прочитаем объект из кеша во втором вызове.
3. Упаковка
var Person = function () {// Область переменной находится внутри функции, и имя VAR не может быть доступно снаружи. var name = "по умолчанию"; return {getName: function () {return name; }, setName: function (newName) {name = newName; }}} (); print (person.name); // доступ непосредственно, результатом является неопределенная print (person.getName ()); Person.setName ("Abruzzi"); print (person.getName ());4. Внедрение классов и наследство
function person () {var name = "default"; return {getName: function () {return name; }, setName: function (newName) {name = newName; }}}; var p = новый человек (); p.setname ("Том"); Alert (p.getName ()); var jack = function () {}; // унаследован от человека jack.prototype = new Person (); // Добавить частный метод jack.prototype.say = function () {alert ("Привет, меня зовут Джек"); }; var j = new jack (); J.SetName ("Джек"); J.Say (); Alert (j.getName ());В конце письма я не знаю, что, в конце концов, вы все обнаружили, что на самом деле использовали многое из этого в проектах, которые вы сделали. Во всяком случае, я столкнулся с этим, и именно так закрытия существуют.
Хотя это клише, это все еще очень важно. Что касается дефектов закрытия, просто скажите, что если вы не злоупотребляете закрытием, это приведет к утечке памяти. Какова утечка памяти на Байду?^_^.
Приведенный выше краткий анализ и интерпретация закрытия в JavaScript (обязательно прочитать)-это все контент, которым я делюсь с вами. Я надеюсь, что вы можете дать вам ссылку, и я надеюсь, что вы сможете поддержать Wulin.com больше.