Bem-vindos à nossa comunidade!

Junte-se a nós e faça parte hoje mesmo!

Alterar escopo com bind()

imagno

Novo Membro
Cadastro
13/5/21
Postagens
4
Curtidas
2
Pontuação
3
Cidade
Simões Filho
Olá, pessoal.
Eu tentei restringir o acesso ao param mudando o contexto da função Escopo de global para obj através do bind, porém não deu certo. Continuo manipulando o param de maneira global.
Alguém poderia explicar onde eu errei? Foi um detalhe ou tô todo atrapalhado?

1621128341878.png
 

mourabraz

Membro
Moderador
Cadastro
23/12/20
Postagens
135
Curtidas
182
Pontuação
100
Cidade
Leiria
@imagno Bom dia, Tudo bem?

Camarada até onde sei para você criar variaveis privadas você teria de colocar essa variável dentro da closure, existe algo mais moderno com o uso de # mas eu ainda não estou por dentro disso. Tradicionalmente a limitação de acesso a variáveis faz-se com as closures.

No seu caso você tenta limitar o acesso a uma propriedade de um objecto... em termos de visibilidade dessa propriedade (tendo em posse a referencia ao objecto) não sei se há alguma forma de resolver! (sem falar no uso do # na declaração das variáveis).

Usar o this para isso não é o caso. Você falou muito bem do contexto e aplicou o bind de maneira correta. Mas isso só fez com que o que ao obj seja criada uma propriedade param e a ela seja atribuída o valor do argumento que você passa à função.

Para que você possa de algiuma forma manter um valor e manipular um valor internamente sem que se tenha acesso externo, dá uma pesquisada em closures. Se você ficar travado me diz qualquer coisa que posso tentar colocar um exemplo.

Abraços
 

imagno

Novo Membro
Cadastro
13/5/21
Postagens
4
Curtidas
2
Pontuação
3
Cidade
Simões Filho
@imagno Bom dia, Tudo bem?

Camarada até onde sei para você criar variaveis privadas você teria de colocar essa variável dentro da closure, existe algo mais moderno com o uso de # mas eu ainda não estou por dentro disso. Tradicionalmente a limitação de acesso a variáveis faz-se com as closures.

No seu caso você tenta limitar o acesso a uma propriedade de um objecto... em termos de visibilidade dessa propriedade (tendo em posse a referencia ao objecto) não sei se há alguma forma de resolver! (sem falar no uso do # na declaração das variáveis).

Usar o this para isso não é o caso. Você falou muito bem do contexto e aplicou o bind de maneira correta. Mas isso só fez com que o que ao obj seja criada uma propriedade param e a ela seja atribuída o valor do argumento que você passa à função.

Para que você possa de algiuma forma manter um valor e manipular um valor internamente sem que se tenha acesso externo, dá uma pesquisada em closures. Se você ficar travado me diz qualquer coisa que posso tentar colocar um exemplo.

Abraços
Obrigado pela explicação.
A noite vou dar prosseguimento com as aulas de Léo sobre funções mas antes vou ler algo sobre closure, valeu mesmo! :)
 

imagno

Novo Membro
Cadastro
13/5/21
Postagens
4
Curtidas
2
Pontuação
3
Cidade
Simões Filho
Acho que entendi.
Desse jeito, eu não consigo acessar diretamente no escopo global o que estiver sendo executado dentro da função Interno(). Só o que eu retornei e instanciei em obj.
1621172148790.png
 

mourabraz

Membro
Moderador
Cadastro
23/12/20
Postagens
135
Curtidas
182
Pontuação
100
Cidade
Leiria
@imagno Boa tarde!

Eu não tenho certeza se entendi bem o que você pretende, mas as palavras que você usou não estão 100% precisas.

Tipo quando dizes:

eu não consigo acessar diretamente no escopo global o que estiver sendo executado dentro da função Interno()

O this dentro da função Interno pode ser muitas coisas, tudo depende de como usamos a função, ou melhor como invocamos a função:
No seu caso como você está usando o operador new para invocá-la o this será o objecto que essa função passa a retornar (caso nao retornes outro explicitamente), melhor dizer, o this será um novo objecto criado pelo operador new!

Nesse seu exemplo você não precisa ter a variável escopo recebendo a função que retorna o objecto obj. Se tiveres algo assim:
JavaScript:
function Interno(param) {
  return this.param = param;
}

const obj = new Interno('teste');

vai dar no mesmo.

O lance das variáveis privadas e de usar closures para isso seria melhor demostrando num exemplo clásico de contador, tipo assim:
JavaScript:
function makeContador() {
  let counter = 0;

  function increment() {
    counter = counter + 1;
    console.log(counter);
  }

  return increment;
}

const meuContador = makeContador();
meuContador(); // 1
meuContador(); // 2

Ao usar a função meuContador é possível incrementar o valor de counter mas não é possível acessá-la diretamente.

Uma outra alternativa seria prover uma função para ler esse valor, tipo assim:
JavaScript:
function makeContador() {
  let counter = 0;

  function increment() {
    counter = counter + 1;
  }
  function getValue() {
    return counter;
  }

  return [increment, getValue];
}

const [paraIncrementar, paraLerOValor] = makeContador();
paraIncrementar();
console.log(paraLerOValor()); // 1
paraIncrementar();
console.log(paraLerOValor()); // 2


Com este exemplo deu para pegar como ter variáveis privadas?

Caso eu tenha ido na direção errada não hesite em me orientar.

Abraços
 

imagno

Novo Membro
Cadastro
13/5/21
Postagens
4
Curtidas
2
Pontuação
3
Cidade
Simões Filho
O que eu tava tentando foi algo semelhante ao seu exemplo do contador, mas não fiz nada dentro da função Interno sem que fosse possível acessar de fora, aí quando juntou com o retorno do this pra criar um novo objeto sem nenhum objetivo claro, realmente ficou difícil de entender.
Foi só um teste, acabou que consegui alcançar meu objetivo depois da sua dica de clousure.
Vou me esforçar pra deixar o código mais claro!
 
Top