Ir para conteúdo
Fórum Script Brasil
  • 0

Escopo


Prove Yourself

Pergunta

Baseado no seguinte código:

<html>
    <body>
        
    </body>
    <script type="text/javascript">
    var calc = function() {
        var result = 0;
        return {
            sum: function(x, y) {
                result = x + y;
                return result;
            },
            sub: function(x, y) {
                result = x - y;
                return result;
            }
        }
    }
    
    var literalCalc = {
        result : 0,
        sum: function(x, y) {
            result = x + y;
            return result;
        },
        sub: function(x, y) {
            result = x - y;
            return result;
        }
    }
    
    var calc = calc();
    console.log(calc.sum(5, 2)); // 7
    console.log(calc.result); // undefined
    
    console.log(literalCalc.sum(5, 2)); // 7
    console.log(literalCalc.result); // 0
    </script>
</html>
Tenho duas dúvidas: - result na closure é considerado privado, já que retornou undefined? - porque o ultimo console.log retorna 0? Não deveria retornar 7, já que foi feita uma operação sum? Agora estou mais confuso ainda. Adicionei a palavra chave this e agora quase tudo é retornado com o valor 7:
<html>
    <body> 
    </body>
    <script type="text/javascript">
    var calc = function() {
        var result = 0;
        return {
            sum: function(x, y) {
                this.result = x + y;
                return this.result;
            },
            sub: function(x, y) {
                this.result = x - y;
                return this.result;
            },
            getResult: function() {
                return this.result;
            },
            getThis: function() {
                return this;
            }
        }
    }
    
    var literalCalc = {
        result : 0,
        sum: function(x, y) {
            this.result = x + y;
            return this.result;
        },
        sub: function(x, y) {
            this.result = x - y;
            return this.result;
        },
        getResult: function() {
            return this.result;
        },
        getThis: function() {
            return this;
        }
    }
    
    var calc = calc();
    console.log(calc.sum(5, 2)); // 7
    console.log(calc.result); // 7
    console.log(calc.getResult()); // 7
    console.log(calc.getThis()); // Object { result = 7 }
    
    console.log(literalCalc.sum(5, 2)); // 7
    console.log(literalCalc.result); // 7
    console.log(literalCalc.getResult()); // 7
    console.log(literalCalc.getThis()); // Object { result = 7 }
    </script>
</html>

Parece que com o this, result é exibido fora da closure... Não parece mais privado como eu acho que é. Alguém pode explicar isso?

Valeu.

Link para o comentário
Compartilhar em outros sites

1 resposta a esta questão

Posts Recomendados

  • 0

i aew carinha, bom vamos as dúvidas:

- result na closure é considerado privado, já que retornou undefined?
exato, qualquer atributos ou método definido sem usar o operador this será considerado privado.
- porque o ultimo console.log retorna 0? Não deveria retornar 7, já que foi feita uma operação sum?

vou tentar explicar no código:

var literalCalc = {
        result : 0,//atributo JSON
        sum: function(x, y) {
            result/*esse result é uma var local do método sum, não é o result do objeto JSON*/ = x + y;
            return result;/*retorna a var result do metodo, não o result do objeto JSON*/
        },
        sub: function(x, y) {/*mesma coisa pra esse método*/
            result = x - y;
            return result;
        }
    }
para usar o atibuto JSON nos métodos, utilize o operador this, ficaria mais ou menos assim:
var literalCalc = {
        result : 0,
        sum: function(x, y) {
            this.result = x + y;
            return this.result;
        },
        sub: function(x, y) {
            this.result = x - y;
            return this.result;
        }
    }

qualquer coisa só posta, abraço!

Editado por Romerito
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...