Pergunta

1) No código a seguir, qual é o raciocínio por trás fazendo gameOfLive uma variável, e não apenas function gameOfLife()?

2) o Que é gol?Parece que uma matriz, mas eu estou familiarizado com a sintaxe e qual o seu chamado.

Eu estou estudando http://sixfoottallrabbit.co.uk/gameoflife/

if (!window.gameOfLife) var gameOfLife = function() {

    var gol = {
        body: null,
        canvas: null,
        context: null,
        grids: [],
        mouseDown: false,
        interval: null,
        control: null,
        moving: -1,
        clickToGive: -1,
        table: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split(''),
        tableBack: null,

        init: function(width, height) {
            gol.body = document.getElementsByTagName('body')[0];
            gol.canvas = document.createElement('canvas');
            if (gol.canvas.getContext) {
                gol.context = gol.canvas.getContext('2d');
                document.getElementById('content').appendChild(gol.canvas);
                gol.canvas.width = width;
                gol.canvas.height = height;
                gol.canvas.style.marginLeft = "8px";

                gol.control = document.getElementById('gridcontrol');

                gol.canvas.onmousedown = gol.onMouseDown;
                gol.canvas.onmousemove = gol.onMouseMove;
                gol.canvas.onmouseup = gol.onMouseUp;

                gol.addGrid(48,32,100,44,8);

                gol.refreshAll();
                gol.refreshGridSelect(-1);
                gol.getOptions(-1);

                gol.genTableBack();
            } else {
                alert("Canvas not supported by your browser. Why don't you try Firefox or Chrome? For now, you can have a hug. *hug*");
            }
        },
    }
}
Foi útil?

Solução

var gameOfLife = function() { }

é um expressão de função, enquanto

function gameOfLife() { }

é um declaração de função.

Para citar Juriy 'kangax' Zaytsev sobre Função expressões vs.Declarações de função:

Há uma sutil diferença em comportamento de declarações e expressões.

Primeiro de tudo, declarações de função são analisados e avaliados antes de qualquer outras expressões são.Mesmo se a declaração é posicionado em último lugar em uma de origem, será avaliado mais importante que qualquer outra expressão contido em um escopo.[...]

Outro traço importante da função declarações é que, declarando-os condicionalmente não é padronizado e varia em diferentes ambientes.Você nunca deve confiar em funções sendo declarada condicionalmente e usar função expressões em vez disso.

Neste caso, como Joel Coehoorn menciona em um comentário, gameOfLife é definido de forma condicional, portanto, é necessário para usar uma expressão de função.

Geral de casos de uso para estas funções definidas condicionalmente é para melhorar a funcionalidade JavaScript em navegadores que não possuem suporte nativo para funções mais recentes (não disponível no anterior ECMAScript/JavaScript versões).Você não quer fazer isso usando a função de declarações, como aqueles irá substituir a funcionalidade nativa de qualquer maneira, o que provavelmente não é o que você quer (considerando velocidade, etc.).Um curto exemplo a este:

if (!Array.prototype.indexOf) { 
    Array.prototype.indexOf = function(item, from) {
        /* implement Array.indexOf functionality,
           but only if there's no native support */
    }
}

Uma grande desvantagem da função expressões é que você no fato de atribuir uma função anônima a uma variável.Isso pode fazer a depuração mais difícil, como o nome da função não é geralmente conhecida quando a execução do script é interrompida (por exemplo, em um ponto de interrupção que você definir).Um pouco de JavaScript depuradores, como o Firebug, tente dar o nome de variável que a função foi atribuída, mas como o depurador tem de adivinhar isso ao analisar o script de conteúdo on-the-fly, isso pode ser muito difícil (o que resulta em um (?)() que está sendo mostrado, em vez de um nome de função), ou mesmo estar errado.

(para exemplos, continue a ler na página, embora o seu conteúdo não são inteiramente adequados para iniciantes)

Outras dicas

  1. Em JavaScript, as funções são primeira classe de objetos.Você pode armazená-los em objetos (variáveis) e passá-los como argumentos para funções.Cada função é, na verdade, um Function objecto.

  2. gol é um objecto que está a ser inicializado utilizando o objeto literal notação.


1) No código a seguir, qual é o raciocínio por trás fazendo gameOfLive uma variável, e não apenas uma "função gameOfLife()"?


As variáveis definidas a nível global são membros do objeto window.Assim, tornando-a uma variável, você torna possível usar a sintaxe window.gameOfLife().É por isso também que eles podem usar o if (!window.gameOfLife) verifique no início do trecho.

Mas o que, realmente, não explicam por que escolheram fazer isto desta forma, e uma declaração de função seria fazer a mesma coisa. Marcel Korpel resposta explica melhor o "por que" das duas opções.


2) o que é o gol?Parece que uma matriz, mas eu estou familiarizado com a sintaxe e qual o seu chamado.


A sintaxe é chamado de compacto objecto de notação.O que torna interessante aqui é que o "compact" que objeto é declarada dentro de uma função.Declarando um objeto dentro de uma função, como isso é útil porque você pode usá-lo para construir objetos javascript, com (efetivamente) membros privados.

A chave é lembrar que as funções e objetos em javascript são a mesma coisa.Assim, o total gameOfLife() a função é realmente um objeto de definição.Além disso, o gol objeto declarado como membro da gameOfLife é mais provável que parte de uma técnica comum para a definição de membros privados.O gameOfLife() função/objeto irá retornar este gol objecto.Todos os outros itens declarados dentro de gameOfLife() função/objeto efetivamente se tornar membros privados da retornado gol instância, enquanto tudo declarado dentro do gol o objeto em si é público.O que eles realmente querem fazer, eventualmente, é escrever código como este:

var game = new gameOfLife();

Agora, quando eles fazem isso, o jogo vai realizar uma variável gol objecto.Os métodos deste objeto ainda ter acesso a itens declarados no total gameOfLife() função, mas outros não (pelo menos, não tão facilmente).Assim, esses itens são efetivamente privada.Itens no gol objeto em si ainda são públicas.Assim, você tem um objeto com ambos os públicos e privados membros para a adequada encapsulamento/esconder informações, exatamente como você gostaria de construir com outras linguagens orientadas a objeto.


Colocar uma função em uma variável permite que você para vir mais tarde, e substituí-la com outra função, substituindo a função de forma transparente para o resto do seu código.Esta é a mesma coisa que você está fazendo quando você especificar "onClick=" em um formulário widget.

certeza:para explicar a sintaxe:

funções de primeira classe de objetos em javascript, então você pode colocar uma função em uma variável.assim, a parte principal do código é, na verdade, uma definição de função armazenados em var gameOfLife, que poderia ser usada mais tarde chamando:

gameOfLife()

o gol é um objeto (hash), e "init" é outro exemplo da sintaxe acima, exceto colocar diretamente no "init" no "gol" de hash.então, que a função pode ser chamada por:

gol["init"](w,h)

De acordo com a nesta página, declarando gameOfLife na sua forma não é diferente de declarar o seu caminho.A forma como eles se definem gol torna um objeto (ou você pode pensar nele como uma matriz associativa).Um semelhante atalho para matrizes é usar colchetes em vez de chaves.

Considerando uma função como uma variável pode ser útil se você gostaria de uma função a ser uma propriedade de um Objeto.(Veja: http://www.permadi.com/tutorial/jsFunc/index.html)

Eu acredito que o gol é um objeto JavaScript descrito em pares nome/valor, assim como o formato JSON.(Veja: http://www.hunlock.com/blogs/Mastering_JSON_(_JavaScript_Object_Notation_))

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top