JS закрытие
Что знать перед закрытием
1. Функциональная область
(1). Специальная особенность JS Language заключается в том, что глобальные переменные могут быть прочитаны непосредственно внутри функций
Кода -копия выглядит следующим образом:
<script type = "text/javascript">
var n = 100;
function parent () {
предупреждение (n);
}
parent (); // 100
</script>
Если в php
Кода -копия выглядит следующим образом:
<? Php
$ n = 100;
function parent () {
Echo $ n;
}
parent (); // Ошибка будет сообщена n не определена
?>
(2). Локальные переменные внутри функции не могут быть прочитаны вне функции
Кода -копия выглядит следующим образом:
<script type = "text/javascript">
function parent () {
var m = 50;
}
parent ();
предупреждение (M); // Ошибка M не определена
</script>
Обратите внимание, что при провозглашении переменных внутри вы должны добавить VAR, в противном случае будет объявлена глобальная переменная.
Кода -копия выглядит следующим образом:
function parent () {
m = 50;
}
parent ();
оповещение (M); // 50
//, конечно, это еще больше в PHP.
Кода -копия выглядит следующим образом:
<? Php
function parent () {
Глобальный $ m; // глобальный, определение и назначение должны быть разделены
$ m = 50;
}
parent ();
Echo $ M; // 50
?>
// Если нет глобального, не будет ошибок определения
Иногда, если вам нужно получить локальные переменные внутри функции, вам необходимо использовать характеристики объема переменных JS. Например, определение функций дочерних функций внутри функции, для дочерних функций, родительская функция является ее глобальной, и функция дочерней функции может получить доступ к переменным в родительской функции (для всего кода JS это локальная переменная)
Кода -копия выглядит следующим образом:
<script type = "text/javascript">
function parent () {
var m = 50;
Функция son () {
предупреждение (м);
}
возвратный сын;
}
var s = parent (); // Сохранить результат во всем мире
S (); // 50
</script>
Все локальные переменные внутри родителей видны их детскими функциями, но локальные переменные в своих дочерних функциях невидимы для их родительских функций. Это структура цепи, уникальную для JS. Дочерний объект будет искать уровень переменных родителей на уровне. Все переменные родительского объекта видны для дочерних объектов, в противном случае он не верно! Вышеупомянутая функция является закрытием
Некоторые студенты могут сделать это
Кода -копия выглядит следующим образом:
function parent () {
var m = 50;
Функция son () {
предупреждение (м);
}
}
parent ();
Son () // Функциональный сын не определяется
Обратите внимание, что в JavaScript функции, объявленные в функции, являются локальными, и они высвобождаются после выполнения функции.
Обратите внимание на разницу между этим и PHP
Кода -копия выглядит следующим образом:
<? Php
function parent () {
Функция son () {
$ m = 50;
Echo $ m;
}
}
parent ();
son (); // output 50 не сообщит об ошибке
?>
Закрытие
Функции внутри определяют функции, мосты, соединяющие внутренние и внешние функции
Есть 2 функции закрытия:
Во -первых, функция чтения внутри вышеупомянутых переменных,
Второе - сохранить значения этих переменных в памяти для реализации обмена данными
Вот несколько примеров закрытия
Кода -копия выглядит следующим образом:
<script type = "text/javascript">
var cnt = (function () {
var i = 0;
return function () {
оповещение (i);
i ++;
}
}) ();
cnt (); // 0
cnt (); // 1
cnt (); // 2
cnt (); // 3
</script>
Я сохраняю результат выполнения анонимной функции (то есть присвоение объявления субфункции глобальной вариантной срезах) в памяти
При выполнении cut () значение напрямую извлекается из памяти. Только функция cnt () может быть вызвана, и невозможно прямо настороже (i)
Вы также можете перенести параметры в закрытие
Кода -копия выглядит следующим образом:
var cnt = (function (num) {
return function () {
предупреждение (num);
num ++;
}
}) (5);
cnt (); // 5
cnt (); // 6
cnt (); // 7
// Конечно, вы также можете передать параметры при вызове
var cnt = (function () {
var i = 0;
возврат функции (num) {
num+= i;
предупреждение (num);
i ++;
}
}) ();
CNT (1); // 1
CNT (2); // 3
CNT (3); // 5
Чтобы лучше понять закрытие, мы смотрим на следующий код
Например, я хочу вернуть массив с 5 функциями в массиве, первая функция появляется 0, а вторая появляется 1 ...
Если код написан так
Кода -копия выглядит следующим образом:
Функция Box () {
var arr = [];
for (i = 0; i <5; i ++) {
arr = function () {return i;}
}
возврат Arr;
}
var a = box ();
предупреждение (a); // массив, содержащий пять функциональных тел
оповещение (a [0] ());
оповещение (a [1] ());
Функциональный корпус функции всплывающего окна
function () {return i;}}
Наконец, это мне 4, а затем ++ становится 5
Для петли остановок
Было обнаружено, что все выскочили 5, что, очевидно, не соответствовало нашим требованиям
Решение 1
Самооценка функций внутри
Кода -копия выглядит следующим образом:
Функция Box () {
var arr = [];
for (i = 0; i <5; i ++) {
arr = (function (num) {return i;}) (i);
}
возврат Arr;
}
var a = box ();
for (var i = 0; i <a.length; i ++) {
предупреждение (а);
}
Но мы обнаружили, что элементы в возвращенном массиве являются результатом выполнения функции, но мы хотим, чтобы функция должна быть обновлена.
Решение 2
Закрытие реализации
Кода -копия выглядит следующим образом:
Функция Box () {
var arr = [];
для (var i = 0; i <5; i ++) {
arr = (function (num) {
return function () {return num;}
})(я);
}
возврат Arr;
}
var arr = box ();
для (var i = 0; i <5; i ++) {
Alert (arr ()); // 0,1,2,3,4
}
Ключевой код
Кода -копия выглядит следующим образом:
arr = (function (num) {
return function () {return num;}
})(я);
Когда я = 0
arr [0] = (function (num) {return function () {return num;}}) (0);
1 часа
arr [1] = (function (num) {return function () {return num;}}) (1);
Вышеуказанное преимущества закрытия! Очень просто и практично.