Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 20.06.2009, 15:57
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 06.04.2009
Сообщений: 2,379

Сообщение от Dmitry A. Soshnikov
(function a() {})();
Только сейчас заметил, в статье, получается, немного промахнулись с одной закрывающей круглой скобкой. Получилось так:
Цитата:
(function a() {}());
Ответить с цитированием
  #12 (permalink)  
Старый 20.06.2009, 16:28
Профессор
Отправить личное сообщение для Dmitry A. Soshnikov Посмотреть профиль Найти все сообщения от Dmitry A. Soshnikov
 
Регистрация: 25.02.2008
Сообщений: 707

Сообщение от Riim
(function a() {})();
(function a() {}());
Обе конструкции - правильные FE, и будут работать.
__________________
Тонкости ECMAScript
Ответить с цитированием
  #13 (permalink)  
Старый 20.06.2009, 16:46
Интересующийся
Отправить личное сообщение для LowCoder Посмотреть профиль Найти все сообщения от LowCoder
 
Регистрация: 19.06.2009
Сообщений: 13

Большое спасибо, осбоенно Dmitry A. Soshnikov за ответы. Очень подробне и обстоятельные. Буду разбиратся дальше. Я писал много на С++ но JavaScript мне кажется "диким" языком после С++. Видимо я не могу пока понять практического смысла столь сложных конструкций. Буду разбиратся. Еще раз сапсибо.
Ответить с цитированием
  #14 (permalink)  
Старый 20.06.2009, 19:14
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 06.04.2009
Сообщений: 2,379

Сообщение от Dmitry A. Soshnikov
Обе конструкции - правильные FE, и будут работать.
Почему первый вариант правильный мне ясно: сначала написано "function a() {}", т. е. FD который не может сразу запускаться, он записан в скобки, про которые написано:
Цитата:

вычисляется по следующей схеме:

1. Вернуть (normal, empty, empty).
т. е. из скобок уже возвращается FE. FD не может возвращаться, это как-то, само собой разумеется. А вот почему второй вариант правильный не понятно, да и вообще первый раз его вижу.

Сообщение от LowCoder
Я писал много на С++ но JavaScript мне кажется "диким" языком после С++.
Часто такое слышу, но в основном проблемы из-за прототипирования вместо стандартного ООП, т. е. основные проблемы у вас еще впереди.
Ответить с цитированием
  #15 (permalink)  
Старый 20.06.2009, 19:50
Профессор
Отправить личное сообщение для Dmitry A. Soshnikov Посмотреть профиль Найти все сообщения от Dmitry A. Soshnikov
 
Регистрация: 25.02.2008
Сообщений: 707

Riim, в любом случае - в скобках - (...) - может быть только FE.

Сообщение от LowCoder
JavaScript мне кажется "диким" языком
собственно, ровно то же самое, можно было сделать обычной FD:

function initDragMaster() {
    // private методы и свойства
    var dragObject
 
    function mouseDown(e) {
        клик на переносимом элементе: начать перенос
    }
 
    function mouseMove(e){
        if (dragObject) {
            отобразить перенос объекта
        }
    }
 
    function mouseUp(e){
        if (dragObject) {
            конец переноса
        }
    }
 
    // public методы и свойства    
    return {
        init: function() {
            // инициализовать контроллер
            document.onmousemove = mouseMove
            document.onmouseup = mouseUp
        },
 
        makeDraggable: function(element){
            // сделать элемент переносимым
            element.onmousedown = mouseDown
        }
    }
 
}

var dragMaster = initDragMaster();


Здесь есть основной минус - функция initDragMaster остаётся жить в глобальном пространстве, даже, когда она уже не нужна. Поэтому, обычно, для создания инициализующего скопа, и создают (анонимную) FE, которая выполнится сразу после создания и уничтожится (тем не менее, весь её внутренний контекст будет доступен в возвращённом объекте; но это уже тема про замыкания).

Сообщение от Riim
но в основном проблемы из-за прототипирования вместо стандартного ООП, т. е. основные проблемы у вас еще впереди.
Да ладно, не пугайте заранее Ничего там сложного нет. Не устану повторять, что разница "Класс" vs. "Прототип" не столь существенна, как "Статика" vs. "Динамика". Ну да, в случае с С++, будет казаться нечто странным поначалу. А, например, тем, кто пришел в JS из Python - что прототипы, что классы - особой разницы не заметят, т.к. Pyhton тоже полностью динамичный.
__________________
Тонкости ECMAScript

Последний раз редактировалось Dmitry A. Soshnikov, 20.06.2009 в 20:01.
Ответить с цитированием
  #16 (permalink)  
Старый 20.06.2009, 21:25
Интересующийся
Отправить личное сообщение для LowCoder Посмотреть профиль Найти все сообщения от LowCoder
 
Регистрация: 19.06.2009
Сообщений: 13

Ну да - JavaScript кажется мне именно странным. Это очень точный термин. Из за очень большой свободы JavaScript кажется мне очень трудночитаемым языком в плане синтаксиса. Когда я первый раз увидел вложенные функции, обращения к переменным до их объявления, констрекции типа
var v= function() ...

, добавление свойств и методов "по ходу дела" ну и еще ряд мелочей у меня волосы встали дыбом
Надо конечно все это еще исследовать сильно. Я просто не понимаю зачем для веб програмирования, которое является чисто прикладной задачей был выбран такой сложный стандарт. Также и для АкшнСкрипт. Сделал на нем небольшой проект с нуля - измучился совершенно. По идее для таких задач должны были использоватся очень простые языки, что бы любой офисный работник мог бы освоить скажем типа ВизуалБейсик. Там все прямолинейно, логично, быстро и относительно безглючно. А тонкие ньюансы и навороченные фишки приводят имхо к сильнопутанному синтаксису и соответственно глюкам и трудноуловимым багам. Впрочем это мои первые и чисто субъективные впечатления.
Ответить с цитированием
  #17 (permalink)  
Старый 21.06.2009, 08:55
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 06.04.2009
Сообщений: 2,379

Сообщение от Dmitry A. Soshnikov
в любом случае - в скобках - (...) - может быть только FE.
В общем-то, объяснение: "так положено и все тут" меня вполне устраивает. Да и все мои эксперименты говорят, что это действительно так. Причем даже подсветка синтаксиса в Visual Studio 2008, похоже, в курсе всей этой темы.
Ответить с цитированием
  #18 (permalink)  
Старый 21.06.2009, 10:43
Профессор
Отправить личное сообщение для Dmitry A. Soshnikov Посмотреть профиль Найти все сообщения от Dmitry A. Soshnikov
 
Регистрация: 25.02.2008
Сообщений: 707

Сообщение от Riim
объяснение: "так положено и все тут" меня вполне устраивает
Да что Вы?

http://javascript.ru/ecma/part11#a-11.1.6

В скобках - уже expression. Всегда expression. Касательно функции, - FE.
__________________
Тонкости ECMAScript
Ответить с цитированием
  #19 (permalink)  
Старый 21.06.2009, 12:53
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 06.04.2009
Сообщений: 2,379

Сообщение от Dmitry A. Soshnikov
В скобках - уже expression. Всегда expression. Касательно функции, - FE.
То, что так задумано мне ясно, не ясно зачем.
Ответить с цитированием
  #20 (permalink)  
Старый 21.06.2009, 17:13
Профессор
Отправить личное сообщение для Dmitry A. Soshnikov Посмотреть профиль Найти все сообщения от Dmitry A. Soshnikov
 
Регистрация: 25.02.2008
Сообщений: 707

Сообщение от Riim
То, что так задумано мне ясно, не ясно зачем.
Что не ясно "зачем"? Почему, оператор группировки всегда внутри себя содержит выражение? Грамматика такая. А что ещё, по Вашему, он там может содержать?

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

var a = {
  b: function () {
    return 10;
  }()
};

alert(a.b); // 10


Почему? Потому что парсер уже распознал функцию как FE. В случае же описания в начале темы - есть неоднозначность - путаница с FD, поэтому парсер выдаёт ошибку. Когда же мы помещаем её в оператор группировки, внутренности которого всегда являются expression'ом (а что ещё, по Вашему, там может быть? ), парсер однозначно определят функцию, как FE, и выполняет.
__________________
Тонкости ECMAScript

Последний раз редактировалось Dmitry A. Soshnikov, 21.06.2009 в 17:20.
Ответить с цитированием
Ответ



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

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