1 Востаннє редагувалося FakiNyan (01.11.2013 21:31:08)

Тема: Поясніть за функції в функції і змінні в функції

Здорів. Поясніть лише одне. Чому от такий код

var func = function(){
    var i=0;
    return function(){
        return i++;
    };
};

console.log(func()());
console.log(func()());
console.log(func()());
console.log(func()());

виведе чотири нулі. А от такий

var func = function(){
    var i=0;
    return function(){
        return i++;
    };
}();

console.log(func());
console.log(func());
console.log(func());
console.log(func());

виведе 0 1 2 3 ???? Дякую с:

2

Re: Поясніть за функції в функції і змінні в функції

Я не бачу різниці між цими двома програмами.

Подякували: koala1

3

Re: Поясніть за функції в функції і змінні в функції

Ви ще б спитали, чому код

Прихований текст
var func = function(){
    var i=0;
    return function(){
        return i++;
    };
};
 
console.log(func()());
console.log(func()());
console.log(func()());
console.log(func()());

виводить 3,14159 26535 89793 23846...

4

Re: Поясніть за функції в функції і змінні в функції

все все все, то чи я зтупив, чи вінда зтупила, коли я копіював код, я вже справив, дивіться.

5

Re: Поясніть за функції в функції і змінні в функції

Якщо швидко - бо в першому випадку кожного разу викликається зовнішня функція наново, з var i=0; а в другому разі вона викликається тільки один раз, а всі наступні виклики чіпляють ту саму i, якій нове значення ніде не надається, тільки старе збільшується.
Якщо детальніше - то самі розпишіть, в якій послідовності відбуваються виклики.

6

Re: Поясніть за функції в функції і змінні в функції

koala написав:

Якщо швидко - бо в першому випадку кожного разу викликається зовнішня функція наново, з var i=0; а в другому разі вона викликається тільки один раз, а всі наступні виклики чіпляють ту саму i, якій нове значення ніде не надається, тільки старе збільшується.
Якщо детальніше - то самі розпишіть, в якій послідовності відбуваються виклики.

ну я так думав: в першому випадку ми викликаєм першу функцію, вона нам повертає іншу функцію, і за допомогою другої пари круглих скобок ми виконуємо отриману функцію. Вона намагається повернути змінну "i", не бачить її в своїй області бачення, потім починає шукати таку змінну в функції на поверх вище, знаходить там її, бачить, що вона = 0, і повертає нам нуль. А в другому все так само, але так, як після основної функції стоїть (), то вона сама себе викликає і повертає нам функцію, і за допомогою () ми виконуємо цю функцію, і вона знову намагається повернути "i", не бачить цієї змінної, потім йде на поверх вище, бачить там, що вона = 0, повертає її.

7

Re: Поясніть за функції в функції і змінні в функції

Ні, не так. В момент створення лямбди вона фіксує всі свої змінні. Різниця в тому, що в першому випадку створюється 4 різні лямбди, а в другому - одна. Жодного пошуку пост-фактум не відбувається.

8

Re: Поясніть за функції в функції і змінні в функції

koala написав:

Ні, не так. В момент створення лямбди вона фіксує всі свої змінні. Різниця в тому, що в першому випадку створюється 4 різні лямбди, а в другому - одна. Жодного пошуку пост-фактум не відбувається.

цеееееее досить таки по новому якось....... тобто в другому випадку змінну func можна порівняти з екземпляром класу?

9

Re: Поясніть за функції в функції і змінні в функції

Ні.

10

Re: Поясніть за функції в функції і змінні в функції

В першому - також. Тільки інший клас.
Так, такий ECMAScript дурнуватий, що все в ньому є, певним чином, об'єктами.

11

Re: Поясніть за функції в функції і змінні в функції

ну ви хоча б детально розповіли, а-то ходите "вакруг даокала", а я так і не знаю, як воно там працює

12

Re: Поясніть за функції в функції і змінні в функції

Ви б хоча б продемонстрували, що знайшли в гуглі на цю тему і зрозуміли, а то писати цілий підручник.

13 Востаннє редагувалося FakiNyan (02.11.2013 12:33:24)

Re: Поясніть за функції в функції і змінні в функції

koala написав:

Ви б хоча б продемонстрували, що знайшли в гуглі на цю тему і зрозуміли, а то писати цілий підручник.

так я знайшов тему про "замыкания", але там купа різних штук, яких я ще не знаю, ооот. А так-то я дивився відео про це, але там чомусь нічо не зрозумів, чи то автор погано розповів, чи то я просто не наздогнав, зара ще раз передивлюсь, от воно, якщо що http://www.youtube.com/watch?v=rpIxGwFz … 853451E24D
я там зрозумів, вся суть в функціях, котрі самі себе викликають, вони чимось дуже відрізняются від простих функцій

14

Re: Поясніть за функції в функції і змінні в функції

все все все, я зрозумів. тут

var func = function(){
    var i=0;
    return function(){
        return i++;
    };
};
 
console.log(func()());
console.log(func()());
console.log(func()());
console.log(func()());

мі кожного разу викликаємо першу функцію, в котрій змінній i присвоюється значення 0, потім вона повертає внутрішню функцію і ми отримуємо 0, а тута

var func = function(){
    var i=0;
    return function(){
        return i++;
    };
}();
 
console.log(func());
console.log(func());
console.log(func());
console.log(func());

змінній func відразу присвоюється внутрішня функція, і так, як ми викликаємо тільки її, і не чіпаєм код, в котрому змінній i присвоюється значення 0, і ця функція зберігає посилання на об'єкт, котрий створився при ініалізації батьківської функції, і при зміні значення змінної i, йде в той об'єкт, повертає значення змінної i, змінює його і всьо. тому воно й змінюється, я наздогнав :3

Подякували: koala1