Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Ошибка вызова замыкания (https://javascript.ru/forum/misc/1871-oshibka-vyzova-zamykaniya.html)

Андрей Параничев 27.09.2008 21:28

Ошибка вызова замыкания
 
Уже второй раз столкнулся с вот такой вот штукой, первый раз даже не понял в чем дело, если честно.
Но сейчас уже стало понятно. Вот код:
var something = function() {
	alert("Something done?")
}

(function() {
	alert("or not?")
})()


Интересно, как быстро становится видна ошибка людям, которые знакомы с JavaScript лучше, чем я?

ZoNT 27.09.2008 23:44

тыщу раз сталкивался, когда обфусцировал код:
var something = function() {
...
}; // Надо ставить ";" !!!

Андрей Параничев 28.09.2008 00:16

ZoNT,
Ну я наверно минут 5-10 искал ошибку, а firebug мне писал что-то вроде:
var some = function() { ... }(function() {...}) is not a function


Я, скорее всего, буду ставить точку с запятой перед конструкцией вызова замыкания:
;(function(){ ... })()


Мне не очень нравится идея ставить точку с запятой после фигурной скобки, и тем более ставить её только если после функции идет вызов локального замыкания - как то не комильфо. Лучше уж наверняка сразу перед конструкцией. В крайнем случае лишная точка с запятой никому не помешает.

Octane 28.09.2008 00:33

Я как то привык всегда и везде ставить точку с запятой, как в C++, помоему так удобнее. Первый раз столкнулся с этой проблемой, когда сжимал код через Packer от Dean Adwards, долго тогда искал, в чем же проблема, оказалось просто забыл поставить точку с запятой.

Dmitry A. Soshnikov 28.09.2008 01:30

Андрей Параничев, согласно 7.9 Автоматическая вставка точек с запятыми точка запятой обязательна после некоторых инструкций ECMAScript, в число которых входит инструкция-выражение.

Цитата:

Сообщение от Андрей Параничев
Я, скорее всего, буду ставить точку с запятой перед конструкцией вызова замыкания

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

P.S.: а еще можно напороться в IE на ошибку, которую я тоже первый раз не сразу увидел - объявляя объект в IE, нельзя ставить лишнюю запятую после последнего свойства:

var obj = {
  a: 1,
  b: 2, // из-за запятой - ошибка в IE
};

Dmitry A. Soshnikov 28.09.2008 12:30

Андрей Параничев, кстати, а в текущем случае - парсер пытается распознать вторую функцию как параметр первой (если убрать последние две сокобки вызова () - сразу будет видно), что еще раз подтверждает, что ставить точку с запятой - это хорошая (нужная) практика и правило хорошего тона в этом языке.

P.S.: к тому же сам B.Eich внедрил механизм автоматической вставки semicolon'a специально, чтобы JS был более лоялен к ошибающимся, новичкам и непрофессионалам (по его словам), поэтому, лучше сразу взять за правило - всегда ставить точку с запятой в нужных местах.

Андрей Параничев 28.09.2008 14:10

Dmitry A. Soshnikov,
Ясно, спасибо, приму к сведению :)

Kolyaj 01.10.2008 10:56

Цитата:

Сообщение от Андрей Параничев
Мне не очень нравится идея ставить точку с запятой после фигурной скобки

Странная позиция, а тут тоже не поставите?
var obj = {}
Фактически то же самое выражение, только правый операнд другой.

Андрей Параничев 01.10.2008 21:16

Kolyaj,
В таком случае - ставил. Теперь буду ставить во всех случаях, где это требуется.


Часовой пояс GMT +3, время: 02:10.