Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 27.09.2008, 21:28
Отправить личное сообщение для Андрей Параничев Посмотреть профиль Найти все сообщения от Андрей Параничев
 
Регистрация: 21.02.2008
Сообщений: 1,250

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

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


Интересно, как быстро становится видна ошибка людям, которые знакомы с JavaScript лучше, чем я?
Ответить с цитированием
  #2 (permalink)  
Старый 27.09.2008, 23:44
Флудер
Отправить личное сообщение для ZoNT Посмотреть профиль Найти все сообщения от ZoNT
 
Регистрация: 25.07.2008
Сообщений: 1,271

тыщу раз сталкивался, когда обфусцировал код:
var something = function() {
...
}; // Надо ставить ";" !!!
Ответить с цитированием
  #3 (permalink)  
Старый 28.09.2008, 00:16
Отправить личное сообщение для Андрей Параничев Посмотреть профиль Найти все сообщения от Андрей Параничев
 
Регистрация: 21.02.2008
Сообщений: 1,250

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


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


Мне не очень нравится идея ставить точку с запятой после фигурной скобки, и тем более ставить её только если после функции идет вызов локального замыкания - как то не комильфо. Лучше уж наверняка сразу перед конструкцией. В крайнем случае лишная точка с запятой никому не помешает.
Ответить с цитированием
  #4 (permalink)  
Старый 28.09.2008, 00:33
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

Я как то привык всегда и везде ставить точку с запятой, как в C++, помоему так удобнее. Первый раз столкнулся с этой проблемой, когда сжимал код через Packer от Dean Adwards, долго тогда искал, в чем же проблема, оказалось просто забыл поставить точку с запятой.
Ответить с цитированием
  #5 (permalink)  
Старый 28.09.2008, 01:30
Профессор
Отправить личное сообщение для Dmitry A. Soshnikov Посмотреть профиль Найти все сообщения от Dmitry A. Soshnikov
 
Регистрация: 25.02.2008
Сообщений: 707

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

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

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

var obj = {
  a: 1,
  b: 2, // из-за запятой - ошибка в IE
};
__________________
Тонкости ECMAScript
Ответить с цитированием
  #6 (permalink)  
Старый 28.09.2008, 12:30
Профессор
Отправить личное сообщение для Dmitry A. Soshnikov Посмотреть профиль Найти все сообщения от Dmitry A. Soshnikov
 
Регистрация: 25.02.2008
Сообщений: 707

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

P.S.: к тому же сам B.Eich внедрил механизм автоматической вставки semicolon'a специально, чтобы JS был более лоялен к ошибающимся, новичкам и непрофессионалам (по его словам), поэтому, лучше сразу взять за правило - всегда ставить точку с запятой в нужных местах.
__________________
Тонкости ECMAScript
Ответить с цитированием
  #7 (permalink)  
Старый 28.09.2008, 14:10
Отправить личное сообщение для Андрей Параничев Посмотреть профиль Найти все сообщения от Андрей Параничев
 
Регистрация: 21.02.2008
Сообщений: 1,250

Dmitry A. Soshnikov,
Ясно, спасибо, приму к сведению
Ответить с цитированием
  #8 (permalink)  
Старый 01.10.2008, 10:56
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

Сообщение от Андрей Параничев
Мне не очень нравится идея ставить точку с запятой после фигурной скобки
Странная позиция, а тут тоже не поставите?
var obj = {}
Фактически то же самое выражение, только правый операнд другой.
Ответить с цитированием
  #9 (permalink)  
Старый 01.10.2008, 21:16
Отправить личное сообщение для Андрей Параничев Посмотреть профиль Найти все сообщения от Андрей Параничев
 
Регистрация: 21.02.2008
Сообщений: 1,250

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



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
не могу понять в чём ошибка scuter Общие вопросы Javascript 2 28.08.2008 15:22
Ошибка системы безопасности ФФ Алекс97 AJAX и COMET 3 25.08.2008 12:39
ошибка с innerHTML Gekt0r Общие вопросы Javascript 15 21.08.2008 11:57
Неопознанная ошибка object Общие вопросы Javascript 2 05.04.2008 18:39
IE: неизвестная ошибка выполнения _Kpot_ Internet Explorer 1 03.04.2008 11:00