1 Востаннє редагувалося rihovar (10.08.2018 14:43:12)

Тема: Замикання

Привіт)
Поясніть, будь-ласка, чому в мене не змінна currNum не замикається та як це можливо пофіксити?
Дякую)

Number.prototype.decrement=(function(){
    let currNum;
    return function(num){  
         currNum=this;
        currNum-=num?num:1;
        return currNum;
    }
      
    
})();

let b=45;
console.log(b.decrement(2));
console.log(b.decrement(2));
console.log(b.decrement());

2

Re: Замикання

так ваша функція не приймає ніяких аргументів, отже оте 2 - просто ігнорується

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

3

Re: Замикання

Вона працює просто не відбувається замикання:
https://jsbin.com/huyicabiri/1/edit?js,console

4

Re: Замикання

що ви маєте на увазі під "замиканням", і як воно повинно відбуватись, на вашу думку?

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

5

Re: Замикання

має виводити:43 41 40
Тіпа щоб 45 замикалось

6

Re: Замикання

Я так зрозумів, воно має змінювати значення числа. Чого не може статися, тому що при присвоєнні (в т. ч., модифікуючому присвоєнні через -=) змінній присвоюється новий числовий об’єкт, а старий лишається незмінним. З таким же успіхом можна було б зробити

b=45; 
c=b;
c-=2;

і сподіватися, що b від того зміниться.

Подякували: leofun01, LoganRoss2

7 Востаннє редагувалося koala (10.08.2018 15:19:21)

Re: Замикання

Ви, мабуть, хочете сказати, що гадали, ніби currNum стане this і далі все працюватиме із this, тобто посиланням на поточний об'єкт.
Але, як я розумію, числа передаються не за посиланням, а за значенням - тому в currNum буде копія числа this.
А взагалі ну його, той JavaScript.

[0]==![0] //True
Array(3)==",," //True

Не кажу вже, що станеться, якщо ввести в консоль 9999999999999999.

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

8

Re: Замикання

тут така фігня, що Number це якби прімитив, але й типу має деякі ознаки об'єкта. Не думаю, що можна змінити його внутрішнє значення.
Але ви можете зробити тако

Number.prototype.decrement=(function(){
    let currNum;
    return function(num){  
         currNum=this;
        currNum-=num?num:1;
        return currNum;
    }
      
    
})();
 
let b=45;
console.log(b.decrement(2));
console.log(b.decrement(2).decrement(2)); // виведе 41
console.log(b.decrement());

9

Re: Замикання

Вона "замикається", просто щоразу викликаючи decrement ви їй присвоюєте this, яка = b = 45.

10

Re: Замикання

https://jsbin.com/qerisozexi/1/edit?js,console
а от зараз працює
І в чому прикол?

11

Re: Замикання

мабуть, різні реалізації інтерпретатора

12 Востаннє редагувалося koala (10.08.2018 16:06:51)

Re: Замикання

FakiNyan написав:

мабуть, різні реалізації інтерпретатора

На одному сайті?
Просто в першому випадку currNum лишався одним і тим самим, а в другому - постійно замінювався на this. І цей this був не тотожним.

13

Re: Замикання

koala написав:
FakiNyan написав:

мабуть, різні реалізації інтерпретатора

На одному сайті?
Просто в першому випадку currNum лишався одним і тим самим, а в другому - постійно замінювався на this. І цей this був не тотожним.

не зрозумів.

14

Re: Замикання

FakiNyan написав:

не зрозумів.

Я бачу.

15

Re: Замикання

koala написав:
FakiNyan написав:

не зрозумів.

Я бачу.

то чому не пояснюєте?

16

Re: Замикання

а, все, зрозумів. Але нащо таке робити, це ж капець якийсь...

17

Re: Замикання

FakiNyan написав:

а, все, зрозумів. Але нащо таке робити, це ж капець якийсь...

А решта JS - то не капець якийсь?

18

Re: Замикання

давайте конкретні приклади

19

Re: Замикання

Див. вище.

20

Re: Замикання

більше конкретних прикладів