O que vc fez foi criar uma função anonima e atribuí-la à variável m2. Tudo o que essa função faz é retornar um objeto.
Vamos analisar as 3 ultimas linhas do seu código:
m2(19,50) // 1)
console.log(calculo()) // 2)
console.log(m2()) // 3)
-
Aqui vc esta retornando um objeto igual a esse:
{largura: 19, comprimento: 50}
Mas como vc não o está atribuindo a nenhuma variável, seu valor se perde. Faz o teste com isso:
-
Esta função não foi definida mesmo. O que vc fez foi criar uma função chamada calculo dentro do escopo daquela função anonima, ela não existe fora dali.
-
Ele te mostra {} porque vc não passou nenhum argumento pra função, logo, ela retornou um objeto vazio.
Encontrei 2 artigos que podem te ajudar a entender o que está acontecendo de uma melhor forma:
Para outros materiais, procure por Constructor Pattern.
Sobre seu código, acredito que ele faz mais sentido assim:
m2 = (largura, comprimento) => {
return{
largura,
comprimento,
calculo: () => (largura/1000) * comprimento
}
}
var teste = m2(19, 50)
console.log(teste)
console.log(teste.calculo())
Percebeu que retornei calculo junto com largura e comprimento? É assim que fazemos quando queremos expor certos dados ou comportamentos de um objeto. Do jeito como vc fez, calculo fica escondida.
Daí, pra usar o comportamento exposto, basta fazer como no meu segundo log.