За последние 24 часа нас посетили 18926 программистов и 1641 робот. Сейчас ищут 1678 программистов ...

Возвращается копия или значение после при return

Тема в разделе "JavaScript и AJAX", создана пользователем Rezovskij, 26 ноя 2016.

  1. Rezovskij

    Rezovskij Новичок

    С нами с:
    18 фев 2016
    Сообщения:
    84
    Симпатии:
    1
    Код (Javascript):
    1. function f (){
    2.     return 10
    3. }
    4. function g (){
    5.     return {}
    6. }
    7. var a = f(); // тут ссылка на значение 10 или копия?
    8. var b = g(); // ссылка на объект
    9.         console.log(typeof(a));// number
    10.         console.log(typeof(b));// object
    Подозреваю, что в переменной a само значение, а в переменной b ссылка на пустой объект. Я прав? Вообщем проблемы с пониманием выполнения функция с оператором return.
     
  2. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    И функция "f", и "g" возвращают результат выполнения. Какой тип будет возвращаемых данных - значения не имеет (числовое, строковое, объект или функция), но то, что они вернули, не является ссылкой. Изменяя значение переменной "a", вы не измените значение внутри функции "f", а изменяя свойства объекта переменной "b", вы так же не измените исходный объект внутри функции "g", как если бы мы работали с реальными ссылками:
    Код (Javascript):
    1. var obj = {
    2.     key: 1
    3. };
    4. var link = obj;
    5. link.key = 100500;
    6. console.log(obj.key, link.key, obj.key === link.key); //  100500 100500 true
    Другое дело, когда мы передаем объект в функцию. В этом случае, передаем мы именно ссылку на него, а не сам объект.
    Код (Javascript):
    1. var obj = {
    2.     key: 1
    3. };
    4. (function(o){
    5.     o.key = 100500;
    6.     return false;
    7. }(obj));
    8. console.log(obj.key); // 100500
    Простыми словами, функция - это своего рода мультиварка: что-то в неё закинули, она приготовила блюдо из имеющихся ингредиентов и "вернула" его вам на стол. Если вы решили подсолить полученный результат, съесть его под грамм 800 водки или просто вылить в унитаз, то это никак не скажется на содержимом мультиварки, не изменит того, что в ней осталось.
     
    Rezovskij и denis01 нравится это.
  3. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Автор. Коль ты задался целью изучить JS, то держи. Это просто замечательнейший учебник.
    Но..судя по вопросам, ты не просто JS изучаешь, ты вообще программировать только учишься, и тут, честно говоря, я бы тебе не советовал начинать с JS. Это, как мне кажется, не тот язык, который следует изучать первым. Сильно уж он специфичен. И может быть сложноват для понимания новичком. Одни замыкания чего стоят. И не говоря уже о том, что JS на 99% состоит из reflection. Очень легко можно скатиться на нем в дебри говнокода и алгоритмового ужаса, если у тебя заведомо не привита культура правильная. А культура и стиль JS, мягко говоря, не дисциплинируют ни разу. Язык настолько гибкий, что только ты сам сможешь удержать ситуацию под контролем, а для этого нужен опыт и знания о том, что такое хорошо, а что такое плохо
    Да, именования вида:
    var a = f()
    var b = g();

    это плохо. Для тестов, разумеется, сойдет, но в реальном мире старайся так не делать.
     
    Rezovskij нравится это.
  4. Rezovskij

    Rezovskij Новичок

    С нами с:
    18 фев 2016
    Сообщения:
    84
    Симпатии:
    1
    @Fell-x27, сейчас пишу на js игру шахматы. Дописать конечно полностью не успею, (в армейку ухожу) но кое какие функции работать будут. Вообще, если есть желание посмотреть мой код и покритиковать с радостью вышлю.
     
  5. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Не высылай, публикуй на каком-нибудь гитхабе и пости тут ссылку. Кто захочет - тот посмотрит :)
    И да, ты правда только начал изучение программирования? И сразу с шахмат? Ох, брат, это, вероятно, зря. Для начала бы крестики-нолики сделать надо хотя бы. С малого начинать. Шахматы это забористо. Хотя, конечно, похвально. Но можешь застрять.
     
  6. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    а тебе не всё равно, что именно кто возвращает? у тебя там не настолько нагруженный код, чтобы такими вопросами париться.
     
  7. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Я думаю, вопрос не в нагрузке, а в принципиальном понимании того, как работает то, что он пишет. Так что он все верное делает, и вопросы правильные задает. Он учится. И хочет знать, что как работает. Редкое свойство нонче. Так что пускай. Это все только на пользу. Это в разы лучше, чем то, что творят балбесы, которые кодят, вообще не задаваясь мыслью, что происходит во время выполнения их кода. Как будто машина работает не на логике, а на магии.
     
    Deonis нравится это.
  8. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    ну не сложно проверить копия возвращается или оригинал - нужно просто что-нибудь поменять и посмотреть, как оно стало в другом месте, откуда снимали копию или ссылку на оригинал.

    Хотя конечно можно просто прочесть. Но я до сих пор проверяю, когда у меня такие вопросы есть, т.к. дефолтное поведение в языке может меняться в веках...
     
  9. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    И да, это же JS. Тут лучше перебдеть, чем недобдеть. А то потом может быть мучительно больно. Тут подводных камней столько, что можно китайскую стену построить. Еще одна причина, почему я против того, чтобы это был первый язык программирования у человека.
     
  10. Rezovskij

    Rezovskij Новичок

    С нами с:
    18 фев 2016
    Сообщения:
    84
    Симпатии:
    1
    @Fell-x27,@Fell-x27@igordata стараюсь вникать вникать, в замыкание дня 3 вникал:D Ссылку вышлю
     
  11. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    а что такое замыкание, расскажи мне
    и как в таймер this передать
    и про декоратор до кучи
     
  12. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Ты уточняй, кому вопросы адресуешь :)
     
  13. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768