JS и его "недостатки"
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.123] |
|
|
Правила раздела:
| Страницы: (66) « Первая ... 60 61 [62] 63 64 ... Последняя » ( Перейти к последнему сообщению ) |
JS и его "недостатки"
|
Сообщ.
#916
,
|
|
|
|
Цитата Астарот @ Тогда мы любую функцию должны признать замыканием Но тогда получится, то что обычно называют областью видимости - нафига нам два названия для одного и того же ну допустим не любую =) насколько я понимаю - замыкание - функа, работающая с внешними переменными в обход аргументов, ака: js// ![]() ![]() var i = 0; function(j){ return i + j; }; ну или: php// ![]() ![]() $i = 0; function($j) use($i){ return $i + $j; }; Добавлено Цитата MyNameIsIgor @ По значению что ли? Ну, специально для болезных учеников Асти такой пример. Если бы get_value захватывала i по значению, то вывод во втором случае был бы 0. с чего это, если i присвоили новое значение? |
|
Сообщ.
#917
,
|
|
|
|
Цитата Serafim @ с чего это, если i присвоили новое значение? <cut> Добавлено Ощущение гранитной стены передо мной возникает при всяком разговоре с вами... Так что до следующего раза. |
|
Сообщ.
#918
,
|
|
|
|
Цитата MyNameIsIgor @ Вы вообще понимаете значение слова "определение"? Вы можете сказать, как определяется замыкание в computer science? Лох в зеркале - обсирай |
|
Сообщ.
#919
,
|
|
|
|
http://www.ecma-international.org/publicat...ST/Ecma-262.pdf см. по Variable Environment Добавлено Астарот, а что фейспалмишь, я даж нашёл его |
|
Сообщ.
#920
,
|
|
|
|
Цитата Serafim @ ну допустим не любую =) насколько я понимаю - замыкание - функа, работающая с внешними переменными в обход аргументов, ака: Тогда любая функция - замыкание, так как может ходить за переменными выше по областям видимости Тут определяющий момент - сохранение области видимости для дальнейшего использования - функция а, в нее вложена функция b, пользуящая переменные объемлющей функции. Я как-то привык думать, что замыкание возникает в тот момент, когда происходит выход из a, и при этом вовне передается b. То есть a уже закончила работу, но ее область видимости где-то лежит себе целехонькая, что бы b могло ей пользоваться Цитата MyNameIsIgor @ Так что до следующего раза. Скатертью по жопе, профпригодный Оссспади, и мнение этого долбоящера кто-то всерьез считает весомым! |
|
Сообщ.
#921
,
|
|
|
|
Цитата MyNameIsIgor @ Ощущение гранитной стены передо мной возникает при всяком разговоре с вами... Так что до следующего раза. скажи мне, в чём разница между: ![]() ![]() var i = 0; i = 23; print(i); и: ![]() ![]() var i = 0; a = function(val) { i = val; } print(a(23)); разница только в наличии функции. Но операции с i ничем не меняются =) Добавлено Цитата Астарот @ Тогда любая функция - замыкание, так как может ходить за переменными выше по областям видимости это в JS так =) и только с внешними варами и глобальными переменными |
|
Сообщ.
#922
,
|
|
|
|
Цитата Serafim @ Астарот, а что фейспалмишь, я даж нашёл его ![]() А что еще можно делать читая идиота, который сам не привел ни одного определения, наваял калечный код, который работает совершенно очевидным образом, но при этом забрызгал все слюнями доказывая, что он работает коряво и не правильно, да еще и ссылку хочет, прям требует? Добавлено Цитата Serafim @ это в JS так =) Так про него ж и говорим ![]() Цитата Serafim @ и только с внешними варами и глобальными переменными Я и говорю - выше. Если выше var'а нет, то он не явно есть в глобальном контексте. |
|
Сообщ.
#923
,
|
|
|
|
Короче спор ниочём =) Строки и числа - это примитивы и передаются только по значению, мне пытаются доказать обратное на примере:
![]() ![]() var i = 0; i = 23; print(i); // Откуда 23? "Почему не 0, если передаётся по значению!" (с) MyNameIsIgor |
|
Сообщ.
#924
,
|
|
|
|
Цитата Serafim @ Короче спор ниочём =) Ну, так MyNameIsIgor же |
|
Сообщ.
#925
,
|
|
|
|
в любом случае - ссылки\значения и отсутствие возможности их определять в JS настолько дикий отстой, что даже прототипно-ориентированное программирование по сравнению с этим - величайшее достоинство языка
|
|
Сообщ.
#926
,
|
|
|
|
Цитата Serafim @ в любом случае - ссылки\значения и отсутствие возможности их определять в JS настолько дикий отстой, что даже прототипно-ориентированное программирование по сравнению с этим - величайшее достоинство языка ![]() Ну, так тогда нужно просто не пользоваться js и дело в шляпе Чё ныть-то? |
|
Сообщ.
#927
,
|
|
|
|
Вообще-то внутри замыкания в жабе, очевидно передается ссылка на переменную. Так например две разные функцию могут менять одну и туже переменную: http://ideone.com/knsSLX
Переменная internal вышла за область видимости и поэтому в стеке ей делать нечего, посему она была скопирована в глобальную кучу (по сути переменные замыканий отличаются от глобальных только тем, что не занимают глобальную область имен) и ссылки на нее розданы трем функциям. Если ссылки на замыкание убились до того как переменные вышли из зоны видимости, то копирования может и не происходить, в данном случае в замыкания будут переданы ссылки на переменную в стеке. Впрочем тонкости реализации могут отличаться и особого значения не имеют, важно что примитивы таки могут быть переданы и даже изменены по ссылке, хотя и через зад. |
|
Сообщ.
#928
,
|
|
|
|
Цитата applegame @ Нет Вообще-то внутри замыкания в жабе, очевидно передается ссылка на переменную. Просто при обращении к переменной - интерпретатор пытается найти её в текущем контексте, если не находит - ищет объявление выше, если не находит - ищет выше и т.д., пока не доходит до глобального. Если же и там её нету, то переменная создаётся Т.е. мы получаем не ссылку на переменную контекстом выше, а просто обращение происходит к первой попавшейся переменной контекстом выше ![]() Именно по-этому несколько функций и работают с одной переменной, т.к. var'ом ты объявил её именно в общем для всех трёх функций контектсе Добавлено ну т.е. в чисто практическом плане - разницы никакой Добавлено Это просто принцип, скорее более идеологический. Если мы работаем с одной переменной, которая объявлена в контексте выше, тогда все операции всё равно по-значению, а если ссылка на переменную передаётся внутрь функции, тогда да, тут работа по ссылке =) Просто смотря с какой стороны смотреть. Именно по стандарту ECMA (ссылка выше) определено именно то, что я сказал - работа происходит с одной переменной выше с именем i, а не с ссылкой на переменную i |
|
Сообщ.
#929
,
|
|
|
|
Цитата Serafim @ Контекста выше не существует, он убит при выходе из функции get(). Ну думаешь же ты, что интерпретатор сохраняет все контексты выше замыкания? Это был бы сущий кошмар. Нет Просто при обращении к переменной - интерпретатор пытается найти её в текущем контексте, если не находит - ищет объявление выше, если не находит - ищет выше и т.д., пока не доходит до глобального. |
|
Сообщ.
#930
,
|
|
|
|
Цитата applegame @ Ну думаешь же ты, что интерпретатор сохраняет все контексты выше замыкания? Это был бы сущий кошмар. Сохраняет =) Если переводить на русский язык - var - это приватная статическая переменная |