Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 25.09.2010, 15:37
Новичок на форуме
Отправить личное сообщение для maasja Посмотреть профиль Найти все сообщения от maasja
 
Регистрация: 24.05.2010
Сообщений: 5

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

Как это javascript заключен в скобки? Что это за скобки после
function(){}
? И каким образом функции внутри функции
function(){}
доступны извне этой функции? Дайте пожалуйста объяснение. Спасибо.
Ответить с цитированием
  #2 (permalink)  
Старый 25.09.2010, 15:42
Особый гость
Посмотреть профиль Найти все сообщения от monolithed
 
Регистрация: 02.04.2010
Сообщений: 4,260

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

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>

Последний раз редактировалось monolithed, 25.09.2010 в 16:13.
Ответить с цитированием
  #3 (permalink)  
Старый 25.09.2010, 15:57
Новичок на форуме
Отправить личное сообщение для maasja Посмотреть профиль Найти все сообщения от maasja
 
Регистрация: 24.05.2010
Сообщений: 5

Спасибо, просто не знал как искать. Было интересно прочитать, почти все вопросы отпали. Но про то что ВЕСЬ скрипт заключен в скобки вроде там не пишет.
Ответить с цитированием
  #4 (permalink)  
Старый 25.09.2010, 16:03
Профессор
Отправить личное сообщение для exec Посмотреть профиль Найти все сообщения от exec
 
Регистрация: 21.01.2010
Сообщений: 1,022

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

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


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

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

Последний раз редактировалось exec, 25.09.2010 в 16:06.
Ответить с цитированием
  #5 (permalink)  
Старый 26.09.2010, 04:30
Новичок на форуме
Отправить личное сообщение для maasja Посмотреть профиль Найти все сообщения от maasja
 
Регистрация: 24.05.2010
Сообщений: 5

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

1. Нет разницы.
2. Важна скобка только перед function, т.к. она из Function Declaration делает Function Expression.

http://dmitrysoshnikov.com/ecmascrip...r-5-functions/
http://dmitrysoshnikov.com/ecmascrip...er-6-closures/
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Объекты JavaScript и рациональность их использования. KBEPT Общие вопросы Javascript 19 11.09.2010 19:22
Это баг do{}while или что? regesh jQuery 10 15.02.2010 00:28
Мини-тест ("опечатка" + стилистика кода + "известный механизм" языка) Dmitry A. Soshnikov Общие вопросы Javascript 23 13.01.2010 14:34
Сторонние библиотеки - быть или не быть? IIIEPJIOK Оффтопик 64 21.03.2009 19:39
Что означает конструкция ? ivanmara Общие вопросы Javascript 55 07.01.2009 02:54