Что это за конструкция такая?
Здравствуйте. Я уже не раз в вижу в библиотеках подобною конструкцию, чуть погуглил, перелистал пару справочников, объяснения не нашел. Вот допустим всем известный визуальный редактор tinymce имеет такой синтаксис:
(function() { //тут дальше подключение файлов, всякие функции }()); Как это javascript заключен в скобки? Что это за скобки после function(){}? И каким образом функции внутри функции function(){}доступны извне этой функции? Дайте пожалуйста объяснение. Спасибо. |
Этот подход можно назвать инкапсуляцией на основе замыканий, что позволяет получить доступ ко всем внешним данным, но при этом защищая свои.
http://habrahabr.ru/blogs/webdev/38642/ http://javascript.ru/basic/closure самые простые примеры: <script type="text/javascript"> (function(i) { alert(i*i); })(10); </script> <script type="text/javascript"> var i = (function(i) {return i*i;}); alert(i(10)) </script> <script type="text/javascript"> window.onload = function(){ var array = document.getElementsByTagName('div'); for(var i=0; i<array.length; i++) { (function(i) { array[i].onclick = function() { alert(i); } })(i); } }; </script> <div>Click1</div> <div>Click2</div> |
Спасибо, просто не знал как искать. Было интересно прочитать, почти все вопросы отпали. Но про то что ВЕСЬ скрипт заключен в скобки вроде там не пишет.
|
Конструкция, которую вы привели, создаёт анонимную функцию и тут же запускает её. Внутри её создаётся пространство имён, доступное только в этой функции.
(function () { var x = 5; })(); alert( x ); // ReferenceError Т. о., эта конструкция позволяет создавать переменные, не засоряя глобальное пространство имён. Если переменную нужно вынести в глобальную область видимости, пишите так: (function () { var x = 5; window.x = 5; })(); alert( x ); |
Всем большое спасибо за ответы. Много чего нового узнал и много чего понял.:)
Но остались еще кое какие вопросы: 1. Какая разница между var i = (function(i) {return i*i;});и var i = function(i) {return i*i;};? 2. Вот ссылка на код TinyMCE, и тут есть такая конструкция которую я описал в первом посте (function() { //тут дальше подключение файлов, всякие функции }());. Не понимаю я вот чего: exec, у вас закрывающая скоба первой скобы(самого первого символа) идет сразу после функции (function () { var x = 5; }), и после этого вы вызываете эту функцию "()". А вот то как я написал в первом посте и то как в коде TinyMCE, то закрывающая скоба первой скобы в самом конце, и после нее вызова "()" не идет. На сколько я понимаю в середине скоб(первого и последнего символа в моем примере) могут быть какие угодно функции, и их вызовы типа function() { //тут дальше подключение файлов, всякие функции }(), но они не должны существовать поскольку родительська функция (скобы), не вызываются. Верно? Объясните пожалуйста. Большое спасибо. |
1. Нет разницы.
2. Важна скобка только перед function, т.к. она из Function Declaration делает Function Expression. http://dmitrysoshnikov.com/ecmascrip...r-5-functions/ http://dmitrysoshnikov.com/ecmascrip...er-6-closures/ |
Часовой пояс GMT +3, время: 00:39. |