Pull to refresh
0
0
Zeroglif @Zeroglif

User

Send message
Синтаксис дополнительной функции и её вызова вполне очевиден. Если нужно создать много функций в одном контексте и при этом "привязать" к каждой функции определённое своё значение, то чего же грешить на замыкания, если в javascript вложенная функция по определению "помнит" не значения, а scope chain. Нужно отдельное значение - сохраняйте отдельное значение, вашим способом или любым другим, например, так:

for (var i = 0; i < 5; ++i) with ({i:i}) funcs[i] = function () { return i*i; };

или (если 'with()' не по душе) сохраняя значение непосредственно в свойстве каждой функции, или конструируя тело функции, или ещё как, не вижу тут хаков...
>"самая распространенная уродливая реализация хорошей идеи"
Какой именно идеи?
Примером поясните. Простеньким.
>Что там не так с точкой с запятой?
В оригинальной статье (перевод подкачал) говорится о процедуре ASI (Automatic Semicolon Insertion), которая была введена для простоты, но на деле является сложным да ещё и плохо прописанным алгоритмом, по своему реализованным в каждом браузере. Намного проще писать, отбивая руками точку с запятой, не запуская ASI для корректировки. В этом смысле D.C. прав, решение о внедрении ASI было ошибочным. Brendan Eich при создании языка пытался отказаться от лишней пунктуации вообще, но это пошло вразрез с политикой менеджмента о Java-like стиле, в результате появилось компромиссное решение - точка с запятой в JavaScript ОБЯЗАТЕЛЬНА, но ставится она как программистом, так и интерпретатором...

> в джаваскрипте они делаются через дж..опу :). Ну, в смысле, через хак с двойной обёрткой.
Замыкания по сути и не надо делать, всё уже заложено в языке, они под ногами на каждом шагу.
JavaScript был заявлен в качестве открытого стандарта, в оригинале в декабре 1995-ого это звучало так:

"Netscape and Sun plan to propose JavaScript to the W3 Consortium (W3C) and the Internet Engineering Task Force (IETF) as an open Internet scripting language standard. JavaScript will be an open, freely licensed proposed standard available to the entire Internet community. Existing Sun Java licensees will receive a license to JavaScript. In addition, Sun and Netscape intend to make a source code reference implementation of
JavaScript available for royalty-free licensing, further encouraging its
adoption as a standard in a wide variety of products."

В итоге к моменту появления JScript ничего открыто не было, ни доков, ни лицензий. Кроме того JavaScript по ходу дела был тихо переписан (из Mocha в 95-ом в SpiderMonkey в 96-ом), обратная совместимость была ужасна, а возможная в будущем лизензия ограничивала внесение изменений. В этих весёлых условиях только идиот стал бы ждать у моря погоды. MS поступила совершенно верно, создав через несколько месяцев собственную реализацию под собственным же именем... ;)
>Почему нужно было включать в javascript прототипы мне тоже неведомо.

Ради простоты. В те времена Java позионировалась для больших околобраузерных задач, JavaScript - для маленьких и ничего больше.

"...in minimizing JS-the-language, I added explicit prototype-based delegation, allowing users to supplement built-in methods with their own in the same given single-prototype namespace." (Brendan Eich)
Давали бы тогда нормальную лицензию - может и лицензировался бы. :)
Раз уж тут два раза в положительном ключе упомянули эту книжку, то в противовес копипаст себя же с винграда: "Pro JаvаSсript Techniques. Общее впечатление такое - набор статей весьма среднего уровня, подобранных по приниципу обо всём по чуть-чуть (но в русле моды). Куча ошибок, самодельная терминология. С практической точки зрения польза от книжки есть - достаточно много скриптов (особенно в DOM-разделе), но всё обыкновенное, нагугливаемое на раз. Резюме - читать по диагонали."
Несмотря на то, что там относительно глухо, форум неудобен и прочая, прочая, всё-таки несколько спецов форум точно просматривают, модер дежурит, и ответ будет получен достаточно точный. Это ценно. Опять же иногда дискуссия может развернуться интересная. И это тоже ценно. Так что надежда есть. ;)
Активность тоже важна, это увеличивает шанс быть правильно услышанным и оцененным. Придут и оценят. Сразу же. А то можно исписаться у себя на блоге, получая по 1-2 комментария и так и не понять за годы, что качества не вышло. Бывает и так. :)
http://karaboz.ru/category/js/ - несколько статей по ООП
http://makishvili.blogspot.com/ - переводы (уже не дышит)
http://script.shabunc.org/ - небольшие заметки (ещё вроде дышит)
http://www.javascript.ru - свежий самопал на чудном домене

А вообще, js-пипл пасётся на форумах, где есть соответствующие разделы: на точке, винграде, дклабе...
sunnybear, уважаю ваш переводческий труд, но оригинальная статья была написана где-то в районе 98-99 гг. прошлого века (на msdn ещё и не то можно откопать). Большая часть этого опуса эры DHTML нынче уже всеми забытый хлам, какое там сравнение с яхушной статьёй, боже упаси. Я вам рекомендую вывесить более очевидное предупреждение о почти 10-летней выдержке статьи, пока тут несчастных экспертов из MS обильно не потоптали ногами за их э... слегка несовременный стиль. Но всё равно вам спасибо за перевод, ностальгия. ;)
Утечки создают не замыкания сами по себе, а их реализация в IE.

Чем интересно таким принципиальным реализация замыканий в IE отличается от реализации замыканий не в IE? Почти ничем, потому как в отличие от циклических ссылок замыкание - это чистый незамутнённый ECMAScript.

Автор оригинальной статьи об этом скромно умалчивает.

Справедливости ради автор ни о чём не умалчивает, ну, что за конспирология-то на пустом месте. Статья давно висит в Internet Explorer Developer Center, тот же Internet Explorer указан уже в названии статьи, а проблемы именно с Internet Explorer's COM infrastructure обозначены в первом же пункте, к тому же они названы ещё и самыми распространёнными...

Спасибо за перевод.
В общем и целом - ясная и доходчивая статья. Дописывайте, линкуйте к хабру, будем сглаживать шероховатости. ;)
Зачем удалили-то? Только время потерял, комментируя. Или не переделке?
>Javascript, помимо стандартных возможностей, предоставляет массу способов
Ниже вы описываете всё те же стандартные возможности, ничего "помимо" этого...

>Числовая переменная
Лучше всё-таки стараться не смешивать свойства и переменные, переменные в javascript - это свойства, но свойства - совсем не обязательно переменные.

>вы можете работать только с одним вновь созданным объектом
Работать можно и с одним, и со всеми, Object - обычный конструктор, плодящий объекты.

>Литеральная нотация работает в версии Javascript 1.2 и выше
С JavaScript1.3/JScript2.0/ECMAScript 3rd Edition

>Создаем наш объект с использованием литеральной нотации
Пары разделяются запятыми, а не точкой с запятой, как в вашем примере.

>имя_переменной : содержание переменной
Слева ни в коем случае не переменные, а идентификаторы/строки/числа, разница, думаю, очевидна.

>С помощью прототипов можно добавлять новые свойства и параметры
Параметры не при чём, это термин из арсенала функций.

>MyInstance.prototype.newproperty = false;
Совершенно не так, у объекта, созданного конструктором, нет свойства 'prototype'.

>экземпляр класса наследует все свойства и методы класса
В javascript 1.x нет классов (со всеми из этого вытекающими).

>Как и в ООП
>Если проводить параллели с ООП
Вы напрасно сравниваете по тексту javascript с OOP в целом, будучи object-based языком, javascript уже там, если уж сравнивать, так против class-based языков и их особенностей.

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

>Итак, мы рассмотрели способы создания объектов
Из пяти "способов создания" к делу относятся только первые два.
Не стоит мифологизировать или идеализировать кроссбраузерность фреймворков. Несмотря на то, что действительно фреймворки считают эту тему важнейшей и на неё упирают рогом в расчёте на свою универсальность, нельзя однозначно сказать, что фреймворки в этом вопросе ушли дальше не-фреймворков. Они приблизительно там же, где и все, кто пишет кроссбраузерно. Там нет марсианского кода, он не зашифрован энигмой, просто посмотрите на него, если вы программируете плотно на js, то все эти решения, только вид сбоку, вы уже должны были видеть раньше не-о-дно-кра-тно.

Ничего не должно вам помешать воплотить кроссбраузерность самостоятельно в лучшем качестве, с оглядкой на свои задачи, без копирования местами слабого кода фреймворка. Это не изобретение велосипеда, если кто-то говорит про велосипед - это значит, что он знает про него всё, а если он знает всё, то должен видеть в любом фреймворке недостающие детали - педали, цепь, а иногда и колёса. В этом смысле лучше изобрести велосипед самому (не заново, а в первый раз) и обращаться при этом лучше к той же "базе знаний", откуда черпают свои решения и создатели фреймворков - к google.com ;) . Хотя, объективности ради нужно сказать, что изучение любой либы может быть полезным...

Что касается псевдокода, то ваш контрпример я учёл, но он меня не разубедил, с jQuery это как-то не вяжется...
www.миллион-других-сайтов.com - нет Prototype.js
чем не аргумент?

Information

Rating
Does not participate
Registered
Activity