Como você aprende mais: Lendo? Escutando? Vendo? Segundo a Pirâmide do aprendizado, de William Glasser, nós aprendemos mais quando estamos.... ensinando! Sim isso mesmo. É por isso que eu digo que é importante criar conteúdo, seja em texto ou seja em video!
E a nossa comunidade no discord é um ótimo lugar pra você começar, bora!!!
Se você não acertou, não tem problema, você vai se surpreender com a explicação:
Isso é possível pois funções são objetos no javascript!!!
Tudo no js (exceto os tipos primitivos) são objetos! E uma função é um tipo especial de objeto, chamado function object. E não é uma função de verdade, e sim um objeto com propriedades invocáveis.
Um function object inclui uma string com o código da função (sim, string!) e, isso aqui, apesar de funcionar, não é recomendado:
var body = ‘return console..log(“Você conhece JS?”)’;
var log = new Function(“log”, body);
log() // => Você conhece JS
Tudo no js (exceto os tipos primitivos) são objetos! E uma função é um tipo especial de objeto, chamado function object. E não é uma função de verdade, e sim um objeto com propriedades invocáveis.
Um function object inclui uma string com o código da função (sim, string!) e, isso aqui, apesar de funcionar, não é recomendado:
var body = ‘return console..log(“Você conhece JS?”)’;
var log = new Function(“log”, body);
log() // => Você conhece JS
Esse site é sensacional pra quem quer aprender git de verdade, avançado! https://learngitbranching.js.org/?locale=pt_BR
learngitbranching.js.org
Learn Git Branching
An interactive Git visualization tool to educate and challenge!
Codar.me
https://instagram.com/stories/codar.me/2313973482590946088
Questão básica, mas que a maioria erra por não estudar o básico!!! Amanhã mando a resposta com explicação aqui pra dar tempo da galera quebrar a cabeça 😁
Codar.me
Photo
Resposta da questão do Insta:
O for vai iterar até o limite de itens do array, então a variável “i” será 0, depois 1, depois 2, depois 3.
Como temos um setTimeout, que é um método que recebe um callback e executa ele assincronamente, e como colocamos um delay de 2 segundos (2000), quando o callback é executado, uma coisa curiosa acontece, ele vai logar 4 vezes “undefined”. Se você logar só o “i” dentro do setTimeout, vai perceber que ele logs 4 vezes o número 4.
Mas peraí, ele não vai só até 3 (que é o limite de indices do array? Como ele loga 4 então?
Bom, a instrução que demos foi “i < arr.length”. No caso, 3 (que é o último índice) não é menor que arr.length, então ele continua incrementando, e quando chega no 4, vê que é menor que arr.length e para a execução, porem a variável “i” agora é 4.
Como temos um callback assíncrono com setTimeout, quando esse callback for chamado, “i” é 4 e por isso não existe no array, retornando “undefined”.
Podemos resolver isso de várias formas, mas a mais simples é: var é uma variável de escopo global, ou seja, independente de onde ela é criada, pode ser acessada de qualquer lugar.
Precisamos deixar o escopo da variável “i” apenas dentro do bloco for, que assim, a cada iteração, será criada uma variável nova, e não alterada a antiga. Assim, podemos usar let, ao invés de var, já que let tem escopo de bloco, e a cada iteração ela fica “presa” no bloco anterior.
Resumindo:
1. Problema: o código vai logar 4 vezes undefined
2. Solução: trocar var por let
O for vai iterar até o limite de itens do array, então a variável “i” será 0, depois 1, depois 2, depois 3.
Como temos um setTimeout, que é um método que recebe um callback e executa ele assincronamente, e como colocamos um delay de 2 segundos (2000), quando o callback é executado, uma coisa curiosa acontece, ele vai logar 4 vezes “undefined”. Se você logar só o “i” dentro do setTimeout, vai perceber que ele logs 4 vezes o número 4.
Mas peraí, ele não vai só até 3 (que é o limite de indices do array? Como ele loga 4 então?
Bom, a instrução que demos foi “i < arr.length”. No caso, 3 (que é o último índice) não é menor que arr.length, então ele continua incrementando, e quando chega no 4, vê que é menor que arr.length e para a execução, porem a variável “i” agora é 4.
Como temos um callback assíncrono com setTimeout, quando esse callback for chamado, “i” é 4 e por isso não existe no array, retornando “undefined”.
Podemos resolver isso de várias formas, mas a mais simples é: var é uma variável de escopo global, ou seja, independente de onde ela é criada, pode ser acessada de qualquer lugar.
Precisamos deixar o escopo da variável “i” apenas dentro do bloco for, que assim, a cada iteração, será criada uma variável nova, e não alterada a antiga. Assim, podemos usar let, ao invés de var, já que let tem escopo de bloco, e a cada iteração ela fica “presa” no bloco anterior.
Resumindo:
1. Problema: o código vai logar 4 vezes undefined
2. Solução: trocar var por let