1
00:00:00,810 --> 00:00:01,580
Bem vindo de volta.

2
00:00:01,710 --> 00:00:04,150
Neste vídeo, vamos falar sobre encerramentos.

3
00:00:04,800 --> 00:00:08,240
Os fechamentos são um dos conceitos mais desafiantes para envolver a cabeça.

4
00:00:08,370 --> 00:00:12,360
Mas uma vez que você realmente entende o que a definição é e eu vi alguns

5
00:00:12,360 --> 00:00:13,570
deles, será muito mais fácil.

6
00:00:13,950 --> 00:00:15,720
Então, o que vamos fazer neste vídeo.

7
00:00:15,720 --> 00:00:18,950
Vamos entender o que é um fechamento e o que não é.

8
00:00:19,200 --> 00:00:22,460
Vamos usar fechamentos para emular variáveis ​​privadas.

9
00:00:22,680 --> 00:00:26,360
Vamos listar alguns casos de uso para fechamentos no mundo real.

10
00:00:27,210 --> 00:00:28,520
Então, o que é um encerramento.

11
00:00:28,830 --> 00:00:35,190
Um fechamento é uma função que faz uso de variáveis ​​definidas em funções externas que

12
00:00:35,220 --> 00:00:36,180
retornaram anteriormente.

13
00:00:36,690 --> 00:00:39,540
Então eu sei que essa definição pode não ter muito sentido agora.

14
00:00:39,690 --> 00:00:41,580
Então, vejamos um exemplo imediatamente.

15
00:00:42,030 --> 00:00:47,210
Vou pressionar a opção de comando Jay e abrir minhas ferramentas de desenvolvimento do Chrome.

16
00:00:47,370 --> 00:00:52,670
é uma função que faz uso de variáveis ​​definidas em nossas funções bem então vamos fazer uma função externa.

17
00:00:52,800 --> 00:00:54,420
Agora, se dissermos que um fechamento

18
00:00:54,630 --> 00:01:01,410
Então, vou fazer uma função chamada externa interna desta função, uma variável chamada dados que é igual à seqüência

19
00:01:01,410 --> 00:01:02,200
de caracteres.

20
00:01:02,220 --> 00:01:06,680
Os fechamentos são um interior da função externa.

21
00:01:06,690 --> 00:01:15,480
Vou retornar uma nova função chamada Inner e dentro desta função interna ou criar uma variável chamada dados internos

22
00:01:15,510 --> 00:01:19,130
e os dados internos são iguais à string.

23
00:01:19,140 --> 00:01:20,520
Impressionante.

24
00:01:21,570 --> 00:01:28,820
Agora, dentro dessa função interna, eu vou retornar os fechamentos de cordas estão com a corda.

25
00:01:28,830 --> 00:01:32,180
Impressionante.

26
00:01:32,940 --> 00:01:34,660
Agora vamos chamar essa função externa.

27
00:01:35,400 --> 00:01:36,870
E o que deveria retornar para nós.

28
00:01:36,990 --> 00:01:40,140
Bem, vai retornar a definição da função interna.

29
00:01:40,410 --> 00:01:46,800
Mas observe aqui que dentro dessa função interna estou fazendo uso de uma variável chamada dados

30
00:01:46,800 --> 00:01:49,080
que foi definida na função externa.

31
00:01:49,110 --> 00:01:55,280
Então, quando chamo essa função externa e chamo a função interna imediatamente, ela retorna a string.

32
00:01:55,320 --> 00:01:57,480
Os fechamentos são incríveis.

33
00:01:57,480 --> 00:02:03,930
Então, você pode realmente não ver o poder dos fechamentos no momento, mas este é apenas um bom

34
00:02:04,230 --> 00:02:11,100
exemplo de usar variáveis ​​definidas em funções externas como essa variável de dados aqui dentro de uma função interna.

35
00:02:11,100 --> 00:02:16,680
Quando a função externa já retornou a nota aqui, a função externa é retornada,

36
00:02:16,680 --> 00:02:22,730
mas ainda posso usar essa variável de dados mesmo que a função externa já tenha retornado.

37
00:02:23,610 --> 00:02:25,680
Vejamos outro exemplo.

38
00:02:25,950 --> 00:02:31,050
Por aqui, eu tenho uma função chamada Outer que aceita um parâmetro A e retorna uma

39
00:02:31,080 --> 00:02:33,730
função chamada Inner que leva um parâmetro b.

40
00:02:34,320 --> 00:02:40,980
A que foi definida na função externa e pelo tempo que se chama que a função externa retornou.

41
00:02:40,980 --> 00:02:43,790
A função interna está fazendo uso da variável

42
00:02:44,070 --> 00:02:50,610
Então, esta função interna é um fechamento, como o outro exemplo que vimos algumas coisas a serem observadas

43
00:02:50,610 --> 00:02:51,010
aqui.

44
00:02:51,060 --> 00:02:56,280
Temos que devolver a função interna para que isso funcione e também temos a capacidade de chamar

45
00:02:56,280 --> 00:03:01,620
a função externa e, em seguida, chamar imediatamente a função interna ou armazenar o resultado da função

46
00:03:01,620 --> 00:03:05,400
interna em uma variável e chamá-lo mais tarde, o que geralmente fazemos.

47
00:03:05,970 --> 00:03:07,520
Vamos tentar um exercício rápido.

48
00:03:07,680 --> 00:03:15,540
Veja se você pode descobrir se qualquer uma dessas funções contém um vídeo de quebra-cabeça de encerramento por um segundo.

49
00:03:15,750 --> 00:03:19,740
Tudo bem, o que você criou nesta primeira função.

50
00:03:19,740 --> 00:03:25,410
Podemos ver que a função interna não está fazendo uso de nenhuma variável para encontrar em uma função

51
00:03:25,410 --> 00:03:26,400
externa que retornou.

52
00:03:26,550 --> 00:03:31,320
Então este aqui não contém um fechamento no segundo exemplo.

53
00:03:31,320 --> 00:03:36,900
Podemos ver que a função interna está fazendo uso de uma variável chamada dados que foi definida

54
00:03:36,900 --> 00:03:41,610
em uma função externa que retornou pelo tempo em que a função interna será chamada.

55
00:03:42,030 --> 00:03:47,980
Então, o primeiro não é, mas o segundo é sempre voltar para a definição de um fechamento.

56
00:03:48,150 --> 00:03:54,030
interna não está fazendo uso de variáveis ​​em uma função externa provavelmente não é um fechamento.

57
00:03:54,090 --> 00:03:56,650
E se você ver que a função

58
00:03:56,820 --> 00:03:58,520
Então, quando você usaria um fechamento.

59
00:03:58,920 --> 00:04:04,200
Bem, um ótimo caso de uso para fechamentos é criar a idéia de uma variável privada em outros idiomas.

60
00:04:04,200 --> 00:04:08,640
Existe suporte para variáveis ​​que não podem ser modificadas externamente, que chamamos de variáveis

61
00:04:08,790 --> 00:04:11,520
​​privadas, mas em javascript não temos essa incorporada.

62
00:04:11,520 --> 00:04:13,780
Felizmente, os fechamentos podem nos ajudar com isso.

63
00:04:13,800 --> 00:04:18,810
Então, vamos dar uma olhada neste exemplo nas ferramentas do cromo dev em uma opção de comando de

64
00:04:18,810 --> 00:04:23,960
imprensa Jagan e abrir isso e eu vou escrever uma função chamada contador e dentro desta função de contador.

65
00:04:23,970 --> 00:04:30,000
Eu vou fazer uma variável chamada count para que igual a zero e dentro desta função de contador

66
00:04:30,090 --> 00:04:32,290
eu vou retornar uma nova função.

67
00:04:32,340 --> 00:04:35,460
Não há aviso aqui mesmo que não estou dando a esta função um nome.

68
00:04:35,460 --> 00:04:38,360
Isso ocorre porque essas funções são anônimas.

69
00:04:38,490 --> 00:04:45,100
Então, se eu quiser nomear esta função, posso chamar isso de algo como contar, mas não preciso.

70
00:04:45,210 --> 00:04:50,230
E dentro desta função interna, vou retornar mais mais contagem.

71
00:04:50,250 --> 00:04:55,380
E o motivo que eu estou fazendo mais mais aqui como um operador de prefixo é para que

72
00:04:55,380 --> 00:04:58,280
a primeira vez que eu chamo isso vai até 1.

73
00:04:58,290 --> 00:05:04,500
Agora eu posso definir esta função de contador para ser igual a uma variável chamada C e irei

74
00:05:04,530 --> 00:05:07,010
salvar R C é igual ao contador.

75
00:05:07,020 --> 00:05:10,130
Agora, o que você acha que C será quando eu dê uma olhada nisso.

76
00:05:10,800 --> 00:05:12,230
Bem, como vimos antes.

77
00:05:12,300 --> 00:05:19,440
Vai ser uma definição de função e se eu chamar C de novo, vou retornar a contagem incrementada

78
00:05:19,590 --> 00:05:20,600
em 1.

79
00:05:20,670 --> 00:05:23,060
Vamos chamá-lo novamente e novamente.

80
00:05:23,220 --> 00:05:29,790
é realmente bom sobre isso é que ninguém tem acesso à contagem de variáveis ​​no escopo que estou no momento.

81
00:05:29,790 --> 00:05:30,920
Mas o que

82
00:05:31,050 --> 00:05:35,230
Se eu tentar acessar a contagem, vou obter uma referência dizendo que a contagem não está definida.

83
00:05:35,370 --> 00:05:41,040
E uma vez que a contagem é uma variável privada, ninguém pode entrar e mudar com o

84
00:05:41,040 --> 00:05:43,360
valor da contagem, começando sempre, será zero.

85
00:05:43,440 --> 00:05:46,810
Pausar o vídeo e tentar copiar este exemplo no console cromado.

86
00:05:46,910 --> 00:05:50,210
Isso ajudará muito com a compreensão de como os fechamentos funcionam.

87
00:05:50,880 --> 00:05:56,780
Vamos dar uma olhada em outro exemplo de variáveis ​​particulares dentro desta função de sala de aula.

88
00:05:56,790 --> 00:06:01,770
Eu tenho uma variável chamada instrutores que é uma matriz de duas cadeias chamado LP.

89
00:06:01,830 --> 00:06:06,240
Esta função de sala de aula retorna um objeto com duas funções.

90
00:06:06,450 --> 00:06:13,320
Obter instrutores e um instrutor obter instrutores me permite apenas exibir desordenado no instrutor é uma

91
00:06:13,410 --> 00:06:18,500
função que leva um parâmetro e adiciona-o à matriz do instrutor.

92
00:06:18,570 --> 00:06:20,960
Então, onde está encerrando o fechamento aqui.

93
00:06:21,180 --> 00:06:24,640
Bem note que os instrutores GET insiram uma função de instrutor.

94
00:06:24,720 --> 00:06:31,860
Ambos fazem uso da variável deste instrutor que está fora desta função aqui e esta

95
00:06:31,860 --> 00:06:33,060
função aqui.

96
00:06:33,060 --> 00:06:40,320
recebem instrutores e adicionam instrutor usando variáveis ​​definidas em funções externas que já retornaram.

97
00:06:40,680 --> 00:06:42,750
Então, essas duas funções

98
00:06:42,750 --> 00:06:48,750
Você pode ver aqui mesmo que os instrutores me permitem imprimir a matriz de Ellen colt e o instrutor me

99
00:06:48,870 --> 00:06:52,250
permite adicionar um instrutor a essa matriz e retornar a teoria.

100
00:06:52,620 --> 00:06:58,470
Mas quando crio uma nova sala de aula com outra variável e recebo os instrutores, podemos ver que

101
00:06:58,470 --> 00:06:59,920
Ian não está aqui.

102
00:07:00,000 --> 00:07:06,810
Finalmente, através do encerramento, fizemos que os instrutores variassem aqui uma variável privada.

103
00:07:06,810 --> 00:07:12,990
Ninguém pode modificá-lo, sempre que uma sala de aula é criada, os instrutores que você recebe sempre

104
00:07:12,990 --> 00:07:14,530
serão chamados de beco.

105
00:07:14,760 --> 00:07:19,380
Então, parece que você está preso conosco por um tempo, então, embora tenhamos um pequeno

106
00:07:19,680 --> 00:07:24,440
exemplo, muitas ferramentas e tecnologias que você estará aprendendo fazem uso de fechamentos um pouco.

107
00:07:24,540 --> 00:07:28,560
Então, quando você está olhando para algum desse código, tente o seu melhor para ver se você pode detectar onde esses

108
00:07:28,560 --> 00:07:29,050
fechamentos são.

109
00:07:29,250 --> 00:07:31,680
Bem, certifique-se de apontar para você também.

110
00:07:31,680 --> 00:07:32,830
Então, o que aprendemos?

111
00:07:32,850 --> 00:07:38,550
Existe um fechamento quando uma função interna faz uso de variáveis ​​declaradas na função externa

112
00:07:38,550 --> 00:07:41,480
que já retornou e o encerramento não existe.

113
00:07:41,490 --> 00:07:47,250
Se você não retornar uma função interna e se essa função interna não faz uso de variáveis

114
00:07:47,310 --> 00:07:52,980
​​retornadas por uma função externa, também vimos que podemos usar fechamentos para criar variáveis ​​privadas e

115
00:07:52,980 --> 00:07:56,770
escrever um código melhor para isolar nossa lógica e nossa aplicação.

116
00:07:57,690 --> 00:07:58,830
E é isso mesmo para fechamentos.

117
00:07:58,830 --> 00:07:59,710
Vejo você no próximo vídeo
