return возвращает тело функции просто как данные, потому что не происходит вызова функции. Функция не запустилась -> данные не обработались -> вернулось тело функции.
Переменная b не видна "снаружи" функции a(). Поэтому получить к ней доступ, тем способом, как ты хочешь, не удастся. Попробуй возвращать не просто результат безымянной функции, а массив всех переменных (если они так нужны) и результатов выполнения вложенных именованных функций.
JavaScript
Moderator: Shaos
-
- Admin
- Posts: 24083
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
интересно получается - переменная не видна, но тем не менее имеет значение и при вызове возвращённой функции всё работает как надоDifferent wrote:return возвращает тело функции просто как данные, потому что не происходит вызова функции. Функция не запустилась -> данные не обработались -> вернулось тело функции.
Переменная b не видна "снаружи" функции a(). Поэтому получить к ней доступ, тем способом, как ты хочешь, не удастся. Попробуй возвращать не просто результат безымянной функции, а массив всех переменных (если они так нужны) и результатов выполнения вложенных именованных функций.
Я тут за главного - если что шлите мыло на me собака shaos точка net
-
- Doomed
- Posts: 408
- Joined: 18 Feb 2007 11:40
В JavaScript большое значение имеют области видимости переменных.Shaos wrote: интересно получается - переменная не видна, но тем не менее имеет значение и при вызове возвращённой функции всё работает как надо
http://habrahabr.ru/blogs/javascript/127482/
-
- Admin
- Posts: 24083
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
Ну ок - переменная существует в пределах функции, а не блока, однако в моём примере функция в которой существует переменная b уже не существует - мы уже получили из неё управление, выдав наружу другую функцию, внутри которой эта переменная b применена, и судя по всему уже имеет значение, которое поменять невозможно, т.е. по сути b превращается из переменной в константу...Different wrote:В JavaScript большое значение имеют области видимости переменных.Shaos wrote: интересно получается - переменная не видна, но тем не менее имеет значение и при вызове возвращённой функции всё работает как надо
http://habrahabr.ru/blogs/javascript/127482/
Я тут за главного - если что шлите мыло на me собака shaos точка net
-
- Admin
- Posts: 24083
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
Задумал я тут сделать интерпретатор своей виртуальной машины и подумалось мне, что делать одну гигантскую функцию с большим свичом, интерпретирующим байткод - это скушно. Поначалу я хотел завести массив функций-обработчиков разных инструкций, но потом меня осенило - вместо этого надо сделать ШИТЫЙ КОД! 
То есть идея такая - программа на JavaScript подтягивает массив кодов и перед запуском интерпретатора делает его предварительную обработку - а имеено строит такой же массив, но в ячейках массива сидят не числовые коды, а указатели на функции, которые СГЕНЕРИРОВАНЫ программно и "скомпилены" через eval
В результате интерпретатор упрощается до невозможности:
Всё
P.S. Аналогичный подход может быть применён для эмуляторов процессоров, например того же 8080, но при условии, что эмулируемый код не будет самомодифицирующимся (хотя и это решаемо).
P.P.S. Провёл небольшой эксперимент - похоже вызов функций из массива действительно несколько быстрее большого свича...

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

В результате интерпретатор упрощается до невозможности:
Code: Select all
setInterval(function(){codf[pc];},0); // codf - array of functions, pc - program counter (modified in functions)

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