Pregunta

1) En el siguiente código, ¿cuál es el razonamiento detrás de hacer gameOfLive una variable y no sólo function gameOfLife()?

2) ¿Cuál es gol?Parece como un array, pero no estoy familiarizado con la sintaxis o lo que es llamado.

Estoy estudiando 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*");
            }
        },
    }
}
¿Fue útil?

Solución

var gameOfLife = function() { }

es un expresión de función, mientras que

function gameOfLife() { }

es un declaración de la función.

Para citar Juriy 'kangax' Zaytsev sobre Las expresiones de función vsLas declaraciones de función:

Hay una sutil diferencia en el comportamiento de las declaraciones y las expresiones.

Primero de todo, las declaraciones de función se analiza y se evalúa antes de cualquier otras expresiones son.Incluso si la declaración se coloca último en un de la fuente, será evaluado todo, cualquier otras expresiones contenida en un ámbito.[...]

Otro rasgo importante de la función declaraciones es que se les declara condicional no es estandarizado y varía a través de diferentes entornos.Usted nunca debe confiar en funciones de ser declarado condicionalmente y uso las expresiones de función en su lugar.

En este caso, como Joel Coehoorn menciona en un comentario, gameOfLife se define de forma condicional, por lo que es necesario para utilizar una expresión de función.

Un general de casos de uso para estos condicionalmente las funciones definidas para mejorar la funcionalidad JavaScript en los navegadores que no tienen soporte nativo para las nuevas funciones (no disponible en anteriores ECMAScript/JavaScript versiones).Usted no quiere hacer esto con las declaraciones de función, como los que sobrescribirá la funcionalidad nativa de todos modos, lo que es más probable que no lo quieres (teniendo en cuenta la velocidad, etc.).Un corto ejemplo de este:

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

Uno de los principales inconvenientes de las expresiones de función es que en el hecho de asignar una función anónima a una variable.Esto puede hacer que la depuración más difícil, como el nombre de la función no se sabe cuando la ejecución del script se detiene (por ejemplo, en un punto de interrupción establecido).Algunos de JavaScript depuradores, como Firebug, tratamos de dar el nombre de la variable de la función que se le asigna, pero como el depurador tiene que adivinar este por el análisis de la secuencia de comandos de contenidos on-the-fly, esto puede ser muy difícil (que se traduce en un (?)() se muestra, en lugar de un nombre de función) o incluso estar equivocado.

(por ejemplo, leer en la página, a pesar de que su contenido no es del todo adecuado para los principiantes)

Otros consejos

  1. En JavaScript, las funciones son objetos de primera clase.Podrías almacenarlos en objetos (variables) y pasarlos como argumentos a funciones.Cada función es en realidad una Function objeto.

  2. gol es un objeto, que se está inicializando usando el objeto literal notación.


1) En el siguiente código, ¿cuál es el razonamiento detrás de hacer de gameOfLive una variable y no solo una "función gameOfLife()"?


Las variables definidas a nivel global son miembros del objeto de ventana.Entonces, al convertirla en una variable, es posible utilizar la sintaxis window.gameOfLife().Por eso también pueden utilizar el if (!window.gameOfLife) verifique al comienzo de su fragmento.

Pero eso no explica realmente por qué eligieron hacerlo de esta manera, y una declaración de función haría lo mismo. La respuesta de Marcel Korpel explica mejor el "por qué" de las dos opciones.


2) ¿Qué es el gol?Parece una matriz, pero no estoy familiarizado con la sintaxis ni cómo se llama.


La sintaxis se llama notación de objetos compactos.Lo que lo hace interesante aquí es que el objeto "compacto" se declara dentro de una función.Declarar un objeto dentro de una función como esta es útil porque puede usarlo para crear objetos javascript con miembros (efectivamente) privados.

La clave es recordar que las funciones y objetos en javascript son lo mismo.Así, la plena gameOfLife() La función es realmente una definición de objeto.Además, el gol objeto declarado como miembro de gameOfLife Lo más probable es que sea parte de una técnica común para definir miembros privados.El gameOfLife() función/objeto devolverá esto gol objeto.Todos los demás artículos declarados dentro del gameOfLife() función/objeto se convierten efectivamente en miembros privados del retorno gol instancia, mientras que todo lo declarado dentro del gol El objeto en sí es público.Lo que realmente quieren hacer es escribir un código como este:

var game = new gameOfLife();

Ahora, cuando hagan eso, la variable del juego contendrá un gol objeto.Los métodos en este objeto todavía tienen acceso a los elementos declarados en su totalidad. gameOfLife() funcionan, pero otros códigos no (al menos, no tan fácilmente).Por lo tanto, esos artículos son efectivamente privados.Artículos en el gol El objeto en sí sigue siendo público.Por lo tanto, tiene un objeto con miembros públicos y privados para una encapsulación/ocultación de información adecuada, tal como lo haría con otros lenguajes orientados a objetos.


Poner una función en una variable le permite venir más tarde y reemplazarla con otra función, reemplazando la función de forma transparente con el resto de su código.Esto es lo mismo que hace cuando especifica "onClick=" en un widget de formulario.

seguro:para explicar la sintaxis:

Las funciones son objetos de primera clase en JavaScript, por lo que puedes poner una función en una variable.por lo tanto, la parte principal de este código es, de hecho, una definición de función almacenada en var gameOfLife, que luego podría usarse llamando a:

gameOfLife()

gol es un objeto (hash) y "init" es otro ejemplo de la sintaxis anterior, excepto que se coloca directamente en la clave "init" en el hash "gol".entonces eso La función a su vez podría ser llamada por:

gol["init"](w,h)

De acuerdo a esta página, declarando gameOfLife a su manera no es diferente de declararlo a tu manera.La forma en que definen gol lo convierte en un objeto (o puede considerarlo como una matriz asociativa).Un atajo similar para las matrices es utilizar corchetes en lugar de llaves.

Considerar una función como una variable puede resultar útil si desea que una función sea una propiedad de un objeto.(Ver: http://www.permadi.com/tutorial/jsFunc/index.html)

Creo que gol es un objeto JavaScript descrito en pares nombre/valor, muy parecido al formato JSON.(Ver: http://www.hunlock.com/blogs/Mastering_JSON_(_JavaScript_Object_Notation_))

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top