Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Что это за конструкция такая? (https://javascript.ru/forum/misc/12003-chto-ehto-za-konstrukciya-takaya.html)

maasja 25.09.2010 15:37

Что это за конструкция такая?
 
Здравствуйте. Я уже не раз в вижу в библиотеках подобною конструкцию, чуть погуглил, перелистал пару справочников, объяснения не нашел. Вот допустим всем известный визуальный редактор tinymce имеет такой синтаксис:
(function() {
//тут дальше подключение файлов, всякие функции
}());

Как это javascript заключен в скобки? Что это за скобки после
function(){}
? И каким образом функции внутри функции
function(){}
доступны извне этой функции? Дайте пожалуйста объяснение. Спасибо.

monolithed 25.09.2010 15:42

Этот подход можно назвать инкапсуляцией на основе замыканий, что позволяет получить доступ ко всем внешним данным, но при этом защищая свои.

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>

maasja 25.09.2010 15:57

Спасибо, просто не знал как искать. Было интересно прочитать, почти все вопросы отпали. Но про то что ВЕСЬ скрипт заключен в скобки вроде там не пишет.

exec 25.09.2010 16:03

Конструкция, которую вы привели, создаёт анонимную функцию и тут же запускает её. Внутри её создаётся пространство имён, доступное только в этой функции.

(function () {
	var x = 5;
})();
alert( x ); // ReferenceError


Т. о., эта конструкция позволяет создавать переменные, не засоряя глобальное пространство имён. Если переменную нужно вынести в глобальную область видимости, пишите так:

(function () {
	var x = 5;
	window.x = 5;
})();
alert( x );

maasja 26.09.2010 04:30

Всем большое спасибо за ответы. Много чего нового узнал и много чего понял.:)
Но остались еще кое какие вопросы:
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() {
//тут дальше подключение файлов, всякие функции
}()
, но они не должны существовать поскольку родительська функция (скобы), не вызываются. Верно?
Объясните пожалуйста. Большое спасибо.

Kolyaj 26.09.2010 08:59

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.