1. Каковы написание и использование закрытия и закрытия
1. Что такое закрытие
Закрытие, официальное объяснение закрытия: выражение (обычно функция), которое имеет много переменных и среды, связанной с этими переменными, поэтому эти переменные также являются частью выражения. Особенности закрытия:
1). В качестве ссылки на переменную функции он находится в активном состоянии, когда функция возвращается.
2). Закрытие - это область стека, где не выпускаются ресурсы, когда функция возвращается.
Проще говоря, JavaScript позволяет использовать внутренние функции, то есть определения функций и выражения функций расположены в организме функции другой функции. Более того, эти внутренние функции могут получить доступ ко всем локальным переменным, параметрам и другим внутренним функциям, объявленным во внешней функции, где они находятся. Когда одна из этих внутренних функций называется вне внешней функции, содержащей их, образуется закрытие.
2. Несколько способов писать и использовать закрытие
Прежде всего, мы должны понимать, что в JS все является объектом, а функция - это тип объекта. Давайте сначала посмотрим на 5 способов записи закрытия и кратко поймем, что такое закрытие. Подробное объяснение будет дано позже.
// Первый метод написания функции Circle (r) {this.r = r; } Circle.pi = 3.14159; Circle.prototype.area = function () {return circle.pi * this.r * this.r; } var c = новый круг (1.0); оповещение (C.Area ());Этот метод письма не является чем -то особенным, он просто добавляет некоторые свойства к функции.
// Второй способ написания var circle = function () {var obj = new Object (); obj.pi = 3,14159; obj.area = function (r) {return this.pi * r * r; } вернуть obj; } var c = new Circle (); оповещение (C.Area (1,0));Этот способ написания - объявить переменную и назначить функцию переменной в качестве значения.
// третий способ написания var circle = new Object (); Circle.pi = 3.14159; Circle.area = function (r) {return this.pi * r * r; } alert (circle.area (1.0));Этот метод лучше всего понимается, то есть для нового объекта, а затем добавляет свойства и методы в объект.
// Четвертый способ написания var circle = {"pi": 3.14159, "область": function (r) {return this.pi * r * r; }}; предупреждение (Circle.area (1.0));Этот метод используется чаще и является наиболее удобным. var obj = {} должен объявить пустой объект.
// Пятый способ написания var circle = новая функция ("this.pi = 3.14159; this.area = function (r) {return r*r*this.pi;}"); оповещение ((новый круг ()). Область (1.0));Честно говоря, я никогда не использовал этот метод письма, поэтому вы можете обратиться к нему.
В целом, вышеуказанные методы чаще встречаются во втором и четвертом, и вы можете выбрать в соответствии с вашими привычками.
Обычно используемый прототип в JS появляется в приведенном выше коде, так что же использует прототип? Давайте посмотрим на это ниже:
var dom = function () {}; dom.show = function () {alert ("show message"); }; dom.prototype.display = function () {alert ("Сообщение свойства"); }; dom.display (); // ошибка dom.show (); var d = new dom (); d.display (); d.show (); //ошибкаСначала мы объявляем переменную и назначаем ее функцию, потому что в JavaScript каждая функция имеет свойство портотипа, а объект - нет. Добавьте два метода, напрямую добавьте и сломайте прототип выше и посмотрите на ситуацию вызова. Результаты анализа следующие:
1. Метод объекта, определенный атрибутом прототипа, является статическим методом и может быть вызван только непосредственно с именем класса! Кроме того, эта переменная не может быть использована в этом статическом методе для вызова других свойств объекта!
2. Метод объекта, определенный с использованием атрибута прототипа, является нестатическим методом и может использоваться только после экземпляра! Это может относиться к другим свойствам в самом объекте в рамках метода!
Давайте посмотрим на другой код:
var dom = function () {var name = "default"; this.sex = "мальчик"; this.success = function () {alert ("успех"); }; }; Alert (dom.name); Alert (dom.sex);Давайте сначала посмотрим, что будет отображаться? Ответ в том, что они оба отображаются неопределенными, почему? Это связано с тем, что в JavaScript каждая функция образует область применения, и эти переменные объявляются в функции, поэтому они находятся в сфере этой функции и недоступны для внешней части. Чтобы получить доступ к переменным, вы должны новые экземпляры.
var html = {name: 'Object', success: function () {this.say = function () {alert ("hello, world"); }; оповещение ("OBJ успех"); }};Давайте посмотрим на этот метод написания. На самом деле, это «грамматический сахар» в JavaScript. Этот метод написания эквивалентен:
var html = new Object (); html.name = 'Object'; html.success = function () {this.say = function () {alert ("Привет, мир"); }; оповещение ("OBJ успех");Переменная HTML является объектом, а не функцией, поэтому она не имеет атрибута прототипа, и его методы являются общедоступными методами, и HTML не может быть создан. В противном случае появится следующая ошибка:
Но это может быть назначено другим переменным в качестве значения, например, var O = html; Мы можем использовать это так:
оповещение (html.name);
html.success ();
Говоря об этом, все кончено? Осторожные люди могут спросить, как получить доступ к методу SAIL в методе успеха? Это html.success.say ()?
Конечно, нет. Как упомянуто выше, из -за ограничений по объему, к нему нельзя получить доступ. Таким образом, вам нужно получить доступ к нему, используя следующий метод:
var s = new html.success (); s.say (); // Вы также можете написать на внешнем html.success.prototype.show = function () {alert ("хаха");}; var s = new html.success (); s.show ();Что касается объема 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 был всего лишь ветвью Java, языком сценариев, и его было легко выучить, но теперь я обнаружил, что действительно много вещей, которые нужно учиться. JavaScript намного сильнее, чем мы думали.
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.