Говорят, что замыкание это функция плюс её окружение, но что это значит? Давайте разберем на примере.
Main.html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>main</title> </head> <body> <button id="JustClick">JustClick</button> <script src="EventHandler.js"></script> <hr> <div id="mydiv"> </div> </body> </html> |
EventHandler.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
/** * @author Stas */ var SomeVar='GlobalVar'; //Объявим глоб. переменную function ExternalFunction(){ var SomeVar='LocalVar'; // Локальную с таким же именем function InternalFunction(){ return SomeVar; // Выведет LocalVar } return InternalFunction(); } function myresult(){ var result=ExternalFunction(); alert(result); } document.getElementById('JustClick').onclick=myresult; |
Итак, главная интрига данного кода – какую переменную выведет alert(result) – глобальную или локальную? Правильный ответ – локальную. Обратите внимание на следующие вещи…
- Внутри функции InternalFunction – есть переменная SomeVar, которая внутри этой функции не определена словом var. По факту это означает, что выводить в инструкции return нечего(undefined). Но не тут-то было….
- Интерпретатор начинает просматривать окружение. В данном случае функция вложена в функцию, значит первый круг поиска – посмотреть во внешней функции, итак, если найдено, значит можно продолжать обработку и далее все как обычно – мы получим результат LocalVar
- Если мы закомментируем строку во внешней функции
1var SomeVar='LocalVar';
то интерпретатор и тут не успокоится – он найдет переменную с таким именем, но она уже окажется глобальной.
В принципе удобно, с одной стороны, но с другой – гипотетически есть возможность для ошибок, когда функция будет использовать переменную, не объявленную внутри, а это может быть совсем не та переменная, которая нужна. Все это может привести к ошибкам.