Код (Javascript): function f (){ return 10 } function g (){ return {} } var a = f(); // тут ссылка на значение 10 или копия? var b = g(); // ссылка на объект console.log(typeof(a));// number console.log(typeof(b));// object Подозреваю, что в переменной a само значение, а в переменной b ссылка на пустой объект. Я прав? Вообщем проблемы с пониманием выполнения функция с оператором return.
И функция "f", и "g" возвращают результат выполнения. Какой тип будет возвращаемых данных - значения не имеет (числовое, строковое, объект или функция), но то, что они вернули, не является ссылкой. Изменяя значение переменной "a", вы не измените значение внутри функции "f", а изменяя свойства объекта переменной "b", вы так же не измените исходный объект внутри функции "g", как если бы мы работали с реальными ссылками: Код (Javascript): var obj = { key: 1 }; var link = obj; link.key = 100500; console.log(obj.key, link.key, obj.key === link.key); // 100500 100500 true Другое дело, когда мы передаем объект в функцию. В этом случае, передаем мы именно ссылку на него, а не сам объект. Код (Javascript): var obj = { key: 1 }; (function(o){ o.key = 100500; return false; }(obj)); console.log(obj.key); // 100500 Простыми словами, функция - это своего рода мультиварка: что-то в неё закинули, она приготовила блюдо из имеющихся ингредиентов и "вернула" его вам на стол. Если вы решили подсолить полученный результат, съесть его под грамм 800 водки или просто вылить в унитаз, то это никак не скажется на содержимом мультиварки, не изменит того, что в ней осталось.
Автор. Коль ты задался целью изучить JS, то держи. Это просто замечательнейший учебник. Но..судя по вопросам, ты не просто JS изучаешь, ты вообще программировать только учишься, и тут, честно говоря, я бы тебе не советовал начинать с JS. Это, как мне кажется, не тот язык, который следует изучать первым. Сильно уж он специфичен. И может быть сложноват для понимания новичком. Одни замыкания чего стоят. И не говоря уже о том, что JS на 99% состоит из reflection. Очень легко можно скатиться на нем в дебри говнокода и алгоритмового ужаса, если у тебя заведомо не привита культура правильная. А культура и стиль JS, мягко говоря, не дисциплинируют ни разу. Язык настолько гибкий, что только ты сам сможешь удержать ситуацию под контролем, а для этого нужен опыт и знания о том, что такое хорошо, а что такое плохо Да, именования вида: var a = f() var b = g(); это плохо. Для тестов, разумеется, сойдет, но в реальном мире старайся так не делать.
@Fell-x27, сейчас пишу на js игру шахматы. Дописать конечно полностью не успею, (в армейку ухожу) но кое какие функции работать будут. Вообще, если есть желание посмотреть мой код и покритиковать с радостью вышлю.
Не высылай, публикуй на каком-нибудь гитхабе и пости тут ссылку. Кто захочет - тот посмотрит И да, ты правда только начал изучение программирования? И сразу с шахмат? Ох, брат, это, вероятно, зря. Для начала бы крестики-нолики сделать надо хотя бы. С малого начинать. Шахматы это забористо. Хотя, конечно, похвально. Но можешь застрять.
а тебе не всё равно, что именно кто возвращает? у тебя там не настолько нагруженный код, чтобы такими вопросами париться.
Я думаю, вопрос не в нагрузке, а в принципиальном понимании того, как работает то, что он пишет. Так что он все верное делает, и вопросы правильные задает. Он учится. И хочет знать, что как работает. Редкое свойство нонче. Так что пускай. Это все только на пользу. Это в разы лучше, чем то, что творят балбесы, которые кодят, вообще не задаваясь мыслью, что происходит во время выполнения их кода. Как будто машина работает не на логике, а на магии.
ну не сложно проверить копия возвращается или оригинал - нужно просто что-нибудь поменять и посмотреть, как оно стало в другом месте, откуда снимали копию или ссылку на оригинал. Хотя конечно можно просто прочесть. Но я до сих пор проверяю, когда у меня такие вопросы есть, т.к. дефолтное поведение в языке может меняться в веках...
И да, это же JS. Тут лучше перебдеть, чем недобдеть. А то потом может быть мучительно больно. Тут подводных камней столько, что можно китайскую стену построить. Еще одна причина, почему я против того, чтобы это был первый язык программирования у человека.