Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Косвенная рекурсия в Javascript (https://javascript.ru/forum/misc/30029-kosvennaya-rekursiya-v-javascript.html)

devote 25.07.2012 07:42

Цитата:

Сообщение от Дзен-трансгуманист
Тогда уж так:

и в чем тут разница? что-то понять не могу

bes 25.07.2012 16:08

Цитата:

Сообщение от devote
и в чем тут разница? что-то понять не могу

очередная особенность FF

oneguy 25.07.2012 16:14

Цитата:

Сообщение от bes
очередная особенность FF

Спецификация ECMAScript запрещает использование объявлений функций внутри блоков, в том числе switch, if, try и др. Все объявления функции должны находиться непосредственно в коде верхнего уровня, коде функции или коде eval.
Поэтому оба кода, приведенные выше, являются невалидными, хотя браузер не выдаёт ошибку.

bes 25.07.2012 16:26

Цитата:

Сообщение от oneguy
Поэтому оба кода, приведенные выше, являются невалидными, хотя браузер не выдаёт ошибку.

И более того - исполняет (кроме FF в первом примере)

devote 25.07.2012 16:30

oneguy,
ты какую там спецификацию то смотришь родной? а то прям любишь тыкать на нее, да вот аргументов нет.. Читай внимательно спецификацию, что бы дураком перед другими не казаться:
"use strict";
try {
  var i = 0;
  function a () { i++; a(); }
  a();
}
catch (e) {
  alert('ваш ёбаный стек равен каким-то сраным: '+i+' вызовам');
}
спецификация запрещает это делать в строгом режиме

oneguy 25.07.2012 16:39

Да, сейчас я аргументирую своё утверждение с помощью спецификации.
Спецификация запрещает объявлять функции внутри блоков в любом режиме, не только строгом.
http://es5.javascript.ru/x12.html#x12 - здесь приведен список возможностей для Statement и в нём нет FunctionDeclaration.
Там же приводится замечание, касающееся нашей темы.
Цитата:

ПРИМЕЧАНИЕ Известно, что несколько широко распространённых реализаций языка ECMAScript поддерживают использование FunctionDeclaration Объявление функции в качестве инструкции. Однако в семантике, применимой к таким объявлениям функций, имеются существенные противоречивые вариации реализаций. Из-за этих противоречий код, написанный с использованием FunctionDeclaration в качестве Statement, не является надёжным при переносе из одной реализации в другую. Поэтому для реализаций ECMAScript рекомендуется либо отключать использование FunctionDeclaration, либо генерировать предупреждение в случае такого использования. Возможно, в последующих версиях языка ECMAScript появятся альтернативные средства для переноса кода, позволяющие объявлять функции в контексте Statement.

hrundel 25.07.2012 16:40

Цитата:

Сообщение от Дзен-трансгуманист (Сообщение 191476)
Maxmaxmахimus,
Тогда уж так:
try {
  var i = 0;
  function a () { i++; a(); }
  a();
}
catch (e) {
  alert('ваш ёбаный стек равен каким-то сраным: '+i+' вызовам');
}
А то в твоем варианте получается 0. :haha:

Ваш код загрузил мой Firefox 11 так, что он завис.
Код:

Похоже, исполняемый на этой странице сценарий занят или не отвечает. Вы можете остановить его сейчас или продолжить и посмотреть, сможет ли он завершить свою работу.

Сценарий: resource://firebug/firebug-service.js:3253


bes 25.07.2012 16:42

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

devote 25.07.2012 16:44

oneguy,
а может стоит читать официальные документы а не чейто перевод? я понимаю что Илья переводил, и все такое. Но английский это язык который каждый понимает по своему. И читать, а темболее утверждать надо по официальным документам а не по тем что кем-то переведены не официально.

devote 25.07.2012 16:44

Цитата:

Сообщение от bes
только надо ссылку кидать, где в спецификации эта информация (спецификация-то большая).

ссылку надо кидать на оригинал


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