JavaScript

Использование и разработка софта (преимущественно на ПЦ)

Moderator: Shaos

Different
Doomed
Posts: 408
Joined: 18 Feb 2007 11:40

Post by Different »

return возвращает тело функции просто как данные, потому что не происходит вызова функции. Функция не запустилась -> данные не обработались -> вернулось тело функции.
Переменная b не видна "снаружи" функции a(). Поэтому получить к ней доступ, тем способом, как ты хочешь, не удастся. Попробуй возвращать не просто результат безымянной функции, а массив всех переменных (если они так нужны) и результатов выполнения вложенных именованных функций.
User avatar
Shaos
Admin
Posts: 24083
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

Different wrote:return возвращает тело функции просто как данные, потому что не происходит вызова функции. Функция не запустилась -> данные не обработались -> вернулось тело функции.
Переменная b не видна "снаружи" функции a(). Поэтому получить к ней доступ, тем способом, как ты хочешь, не удастся. Попробуй возвращать не просто результат безымянной функции, а массив всех переменных (если они так нужны) и результатов выполнения вложенных именованных функций.
интересно получается - переменная не видна, но тем не менее имеет значение и при вызове возвращённой функции всё работает как надо
Я тут за главного - если что шлите мыло на me собака shaos точка net
Different
Doomed
Posts: 408
Joined: 18 Feb 2007 11:40

Post by Different »

Shaos wrote: интересно получается - переменная не видна, но тем не менее имеет значение и при вызове возвращённой функции всё работает как надо
В JavaScript большое значение имеют области видимости переменных.
http://habrahabr.ru/blogs/javascript/127482/
User avatar
Shaos
Admin
Posts: 24083
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

Different wrote:
Shaos wrote: интересно получается - переменная не видна, но тем не менее имеет значение и при вызове возвращённой функции всё работает как надо
В JavaScript большое значение имеют области видимости переменных.
http://habrahabr.ru/blogs/javascript/127482/
Ну ок - переменная существует в пределах функции, а не блока, однако в моём примере функция в которой существует переменная b уже не существует - мы уже получили из неё управление, выдав наружу другую функцию, внутри которой эта переменная b применена, и судя по всему уже имеет значение, которое поменять невозможно, т.е. по сути b превращается из переменной в константу...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24083
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

Задумал я тут сделать интерпретатор своей виртуальной машины и подумалось мне, что делать одну гигантскую функцию с большим свичом, интерпретирующим байткод - это скушно. Поначалу я хотел завести массив функций-обработчиков разных инструкций, но потом меня осенило - вместо этого надо сделать ШИТЫЙ КОД! :)

То есть идея такая - программа на JavaScript подтягивает массив кодов и перед запуском интерпретатора делает его предварительную обработку - а имеено строит такой же массив, но в ячейках массива сидят не числовые коды, а указатели на функции, которые СГЕНЕРИРОВАНЫ программно и "скомпилены" через eval ;)

В результате интерпретатор упрощается до невозможности:

Code: Select all

setInterval(function(){codf[pc];},0); // codf - array of functions, pc - program counter (modified in functions)
Всё :roll:

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

P.P.S. Провёл небольшой эксперимент - похоже вызов функций из массива действительно несколько быстрее большого свича...
Я тут за главного - если что шлите мыло на me собака shaos точка net