| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > JavaScript: Общие вопросы > Связь параметров и объекта arguments |
| Автор: Се ля ви 22.1.2009, 16:26 | ||
| Вообще, задача передо мной стоит такая - нужно добиться перечислимости переменных внешней функции из её под-функции без необходимости называть их по именам. Если бы у нас была ссылка на т.н. "call object", то мы могли бы просто перечислить его свойства через for-in, но в ECMA-262 он заявлен как неявный объект и ссылку на него получить не получится. Я хотел действовать через объект arguments и перечислять его как массив, по индексам, присваивая его элементам нужные значения - тогда и соответствующие параметрам переменные тоже меняли бы значения, поскольку между параметрами и arguments существует синонимичная связь. Но оказалось, что эта связь рвётся при выходе из функции во всех браузерах, кроме Google Chrome:
Т.е. связь, которая работает при первом вызове setX - внутри ещё выполняющейся функции 'a' - работает нормально. Но стоит нам функцию завершить, как она рвётся и переменная x после этого существует отдельно от args[0] и смена одного уже не приводит к автоматической смене другого. Собственно, я не нашёл явного упоминания о том, как это должно работать, в ECMA-262, но угадайте, почему поведение Chrom`а мне нравится больше ;))) И как же мне теперь перечислимости переменных внешней функции добиваться? :( |
| Автор: Се ля ви 22.1.2009, 18:30 | ||||
Да, но где сказано, что эта связь должна или не должна рваться при выходе из функции - что я и продемонстрировал.
Мне нужно именно copy/pase решение, что бы пользователь мог вставить мой блок кода в любую функцию и она приобретала специфический функционал. А как разработчик назовёт свои переменные, я не могу заранее знать. Мне нужно решение в общем виде. Я просто пытаюсь совместить инкапсуляцию на основе замыканий и принципы prototype-based OOP. Я расписывал это в двух статейках - http://vingrad.ru/blogs/selavy/2009/01/17/javascript-osobennosti-inkapsulyatsii-na-osnove-zamyikaniy-chast-1/ и http://vingrad.ru/blogs/selavy/2009/01/20/javascript-osobennosti-inkapsulyatsii-na-osnove-zamyikaniy-chast-2-mehanizm-vyizova-metodov/. |
| Автор: Zeroglif 22.1.2009, 20:50 |
К моменту вызова внутренней функции контекст исполнения внешней функции жив? Нет. Фишка с алиасами имеет отношение к контексту, описывается в этом разделе (10 Execution Contexts), если контекста уже нет, и объект активации уже и не объект активации (терминологически), а безыдейная часть scope chain ;) , то магию алиасов можно убрать. |
| Автор: IDVsbruck 22.1.2009, 22:13 | ||
А если применить вариант с сохраненным состоянием?
var a1 = a(10); - тут все так и осталось. А при вызове a1(20); не знаю, как в Хроме, но в ИЕ выдается 'args[0] = 20 = 20' и 'x = 20'. |
| Автор: Се ля ви 23.1.2009, 00:30 | ||||
Чё-то как-то непоследовательно получается. Вся фишка closures как раз и состояла в том, что бы при выходе из контекста можно было безпроблемно обращаться к этому контексту. Так значит, всё и должно работать так, как будто мы в контексте. Другое дело, что надо было это специально в стандарте прописать, а то так и получается, что можно понимать и так и эдак... Грустно. Не знаешь, разработчики JS 2.0 на этот момент не обратили внимания? Может, им написать? Похоже, единственный выход - использовать with... :((( Несмотря на все его минусы. IDVsbruck, мне нужно добиться изменения внутренних переменных функции из её под-функции, но сделать это так, что бы от изменения имён и количества этих самых переменных функции алгоритм менять не надо было бы. Это можно сделать с использованием "магии алиасов", но она отключается при завершении работы функции - вот в чём проблема. А зачем мне эти извраты с ownerParameter? Да я могу просто так написать:
и в конце он мне выведет желанные "x = 20", при чём любые браузеры, поддерживающие ECMAScript. Но задача-то у меня не та, что бы он мне вывел этот алерт, а что бы действительно переменная x поменялась от того, что я поменял args[0]! Если я заменю вывод x на что-то другое - я не решу нужной мне задачи. Так я могу и тупо текстом прописать, что бы он мне вывел то, что мне надо. |