Contexto Léxico - Javascript

10/11/2019

11

Eu tenho uma dúvida em relação ao seguinte código:

global.preco = 10
global.desc = 0.18

const teste = (imposto = 0, moeda = 'R$') => {
  preco = 20
  desc = 0.453523
  console.log('valor de preco',preco)
  console.log('valor de desconto',desc)
  return `$ ${preco * (1 - desc) * (1 + imposto).toFixed(2)}`
}



const teste2 = function (imposto = 0, moeda = 'R$'){
  console.log('valor de preco',this.preco)
  console.log('valor de desconto',this.desc)
  return `$ ${this.preco * (1 - desc) * (1 + imposto).toFixed(2)}`
}


const produto = {
  nome: 'notebook',
  preco: 4589,
  desc: 0.15,
  teste
}

console.log('valor da função teste: ',teste())
console.log('valor da função teste2: ',teste2())


Queria entender porque as duas funções estão utilizando o valor de PREÇO e DESC definidos dentro da arrow function TESTE, sendo que as arrows functions trabalham com variáveis de escopo global, e as expressions functions tem o seu this definidos no escopo global. E se eu comentar as variáveis locais de TESTE, as duas funções passam a utilizar as variáveis de escopo global.
Responder

Post mais votado

14/11/2019

Dae Wendel !! Tudo bem?

Cara, pelo que entendi vc tem um problema no seu código com escopos de variáveis, certo? Pelo que parece vc está querendo que dentro da função teste() as variáveis preco e desc sejam locais, ou seja, os valores que vc definir para essas variáveis dentro de teste() não afetem os valores definidos para elas no escopo global. Isso?

Se for isso mesmo... Em javascript para vc definir variáveis com escopo local terá que usar a palavra reservada "var" antes do nome delas... ficaria assim seu código:
global.preco = 10
global.desc = 0.18
 
const teste = function (imposto = 0, moeda = 'R$') => {
  var preco = 20
  var desc = 0.453523
  console.log('valor de preco',preco)
  console.log('valor de desconto',desc)
  return `$ ${preco * (1 - desc) * (1 + imposto).toFixed(2)}`
}
 
 
 
const teste2 = function (imposto = 0, moeda = 'R$'){
  console.log('valor de preco',this.preco)
  console.log('valor de desconto',this.desc)
  return `$ ${this.preco * (1 - desc) * (1 + imposto).toFixed(2)}`
}
 
 
const produto = {
  nome: 'notebook',
  preco: 4589,
  desc: 0.15,
  teste
}
 
console.log('valor da função teste: ',teste())
console.log('valor da função teste2: ',teste2())


Outro detalhe, eu inseri a palavra function na linha onde vc define a função teste...

const teste = function (imposto = 0, moeda = 'R$') => {


Não testei aqui, mas acho que isso poderá lhe ajudar...

Espero ter ajudado,
abraço e bons códigos.
Responder

Mais Posts

10/11/2019

Wendel Rios

Eu tenho uma dúvida em relação ao seguinte código:

global.preco = 10
global.desc = 0.18

const teste = (imposto = 0, moeda = 'R$') => {
  preco = 20
  desc = 0.453523
  console.log('valor de preco',preco)
  console.log('valor de desconto',desc)
  return `$ ${preco * (1 - desc) * (1 + imposto).toFixed(2)}`
}



const teste2 = function (imposto = 0, moeda = 'R$'){
  console.log('valor de preco',this.preco)
  console.log('valor de desconto',this.desc)
  return `$ ${this.preco * (1 - desc) * (1 + imposto).toFixed(2)}`
}


const produto = {
  nome: 'notebook',
  preco: 4589,
  desc: 0.15,
  teste
}

console.log('valor da função teste: ',teste())
console.log('valor da função teste2: ',teste2())


Queria entender porque as duas funções estão utilizando o valor de PREÇO e DESC definidos dentro da arrow function TESTE, sendo que as arrows functions trabalham com variáveis de escopo global, e as expressions functions tem o seu this definidos no escopo global. E se eu comentar as variáveis locais de TESTE, as duas funções passam a utilizar as variáveis de escopo global.



*** No caso ali na pergunta eu quis dizer que as arrows functions trabalham com escopos locais
Responder

15/11/2019

Wendel Rios

Dae Wendel !! Tudo bem?

Cara, pelo que entendi vc tem um problema no seu código com escopos de variáveis, certo? Pelo que parece vc está querendo que dentro da função teste() as variáveis preco e desc sejam locais, ou seja, os valores que vc definir para essas variáveis dentro de teste() não afetem os valores definidos para elas no escopo global. Isso?

Se for isso mesmo... Em javascript para vc definir variáveis com escopo local terá que usar a palavra reservada "var" antes do nome delas... ficaria assim seu código:
global.preco = 10
global.desc = 0.18
 
const teste = function (imposto = 0, moeda = 'R$') => {
  var preco = 20
  var desc = 0.453523
  console.log('valor de preco',preco)
  console.log('valor de desconto',desc)
  return `$ ${preco * (1 - desc) * (1 + imposto).toFixed(2)}`
}
 
 
 
const teste2 = function (imposto = 0, moeda = 'R$'){
  console.log('valor de preco',this.preco)
  console.log('valor de desconto',this.desc)
  return `$ ${this.preco * (1 - desc) * (1 + imposto).toFixed(2)}`
}
 
 
const produto = {
  nome: 'notebook',
  preco: 4589,
  desc: 0.15,
  teste
}
 
console.log('valor da função teste: ',teste())
console.log('valor da função teste2: ',teste2())


Outro detalhe, eu inseri a palavra function na linha onde vc define a função teste...

const teste = function (imposto = 0, moeda = 'R$') => {


Não testei aqui, mas acho que isso poderá lhe ajudar...

Espero ter ajudado,
abraço e bons códigos.
. Exato, Jorge, era exatamente isso. Eu tinha esquecido de declarar as variaveis com a palavra reservada antes, no meu caso quando não estou utilizando constantes eu opto por utilizar a palavra reservada let mesmo. Valeu.
Responder