Switch case

Boa tarde pessoal,

Estou tentando executar o código abaixo porém não estou conseguindo.

Objetivo: criar duas variáveis 1ª UF, 2ª ICMS. Preciso que a variável ICMS receba um valor de acordo com o “UF”.

Fiz dessa forma.

const uf = "sp"
const icms = valor()

valor = (uf) => {
	return
	
	switch(uf) {
	case "sp": 0,18
		break
	case "mg": 0,12
		break

Execute esse código:

var valor = (uf) => {
	switch(uf) {
	case 'sp':
		return 0.18;
	case 'mg':
		return 0.12;
	}
}

const uf = 'sp';
const icms = valor(uf);
	
console.log(icms);

@Lucas_Camara porque na variável “icms” você coloca " valor(uf)"?

Isso significa que a função valor declarada no início do código está sendo invocada passando a uf como parâmetro. O resultado dessa chamada (avaliado pelo switch) será atribuído à variável icms.

Entendi! Muito obrigado. um dia eu chego nesse nível.

Mais uma pergunta,

Porque as variáveis vão depois da função e não antes?

Se a variável icms for declarada antes da função valor, vai dá erro falando que a função valor não existe.

Então sempre terei que fazer dessa forma?

No JS, há um conceito chamado hoisting, que permite vc declarar funções ou variáveis fora de ordem, que, ao executar, vai funcionar do mesmo jeito. Porém, isso não se aplica a function expressions (que é o que vc usou no seu código) ou se o código estiver num escopo com 'use strict';.

Entendi, pra mim a variável vinha entes da função.

Você pode declarar antes da função, mas assim:

<script>
	const uf = 'sp';
	var icms;
	
	var valor = (uf) => {
		switch(uf) {
		case 'sp':
			return 0.18;
		case 'mg':
			return 0.12;
		}
	}
	
	icms = valor(uf); // só depois da função criada que chamamos ela atribuindo à variável icms
	
	console.log(icms);
</script>

Eu fiz usando o Function e deu certo também.

E com hoisting (agora usando function declaration ao invés de function expression), vc pode declarar a função depois das variáveis sem problemas:

<script>
	const uf = 'sp';
	const icms = valor(uf); // funciona!
	
	console.log(icms);
	
	function valor(uf) { // o hoisting pega essa função e joga pro topo quando o script é executado
		switch(uf) {
		case 'sp':
			return 0.18;
		case 'mg':
			return 0.12;
		}
	}
</script>