Domanda

1) Nel codice seguente, qual è il ragionamento alla base del making gameOfLive una variabile e non solo function gameOfLife()?

2) Cos'è gol?Sembra un array, ma non ho familiarità con la sintassi o come si chiama.

sto studiando 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*");
            }
        },
    }
}
È stato utile?

Soluzione

var gameOfLife = function() { }
.

è un'espressione della funzione , mentre

function gameOfLife() { }
.

è una dichiarazione della funzione .

Per preventivare JUIRY 'KANGAX' ZAYTESEV A proposito Espressioni di funzione vs. Dichiarazioni funzione :

.

c'è una sottile differenza in Comportamento delle dichiarazioni e Espressioni.

Prima di tutto, dichiarazioni funzione sono analizzati e valutati prima di qualsiasi Altre espressioni sono. Anche se La dichiarazione è posizionata per ultimo in a fonte, sarà valutato Principale eventuali altre espressioni contenute in un ambito. [...]

un altro Tratto importante della funzione Le dichiarazioni sono quelle dichiaranti condizionalmente non è standardizzato e varia tra diversi ambienti. Non dovresti mai fare affidamento sulle funzioni essere dichiarato condizionalmente e uso Espressioni di funzione invece.

In questo caso, mentre Joel Coehoororn menziona in un commento, gameOfLife è definito condizionatamente, quindi è necessario utilizzare un'espressione di funzione.

Un caso di utilizzo generale per queste funzioni definite in modo condizionale è quello di migliorare la funzionalità JavaScript nei browser che non dispongono di supporto nativo per le funzioni più recenti (non disponibile nelle versioni ECMascript / JavaScript precedenti). Non vuoi farlo usando le dichiarazioni delle funzioni, poiché quelle sovrascriveranno comunque la funzionalità nativa, che molto probabilmente non è quello che vuoi (considerando la velocità, ecc.). A breve Esempio di questo:

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

Un importante inconveniente di espressioni di funzione è che si assegna infatti una funzione anonima a una variabile. Questo può rendere debug di più , poiché il nome della funzione di solito non è noto quando L'esecuzione dello script si ferma (ad esempio, su un punto di interruzione impostato). Alcuni Debugger JavaScript, come Firebug, cerca di dare il nome della variabile a cui è stata assegnata la funzione, ma come il debugger deve indovinare questo ansando il contenuto di script on-the-fly, questo può essere troppo difficile (che si traduce in a (?)() viene visualizzato, invece di un nome della funzione) o addirittura sbagliato.

(per esempi, leggere sulla pagina, anche se i suoi contenuti non sono interamente adatti per i principianti)

Altri suggerimenti

    .
  1. In JavaScript, le funzioni sono oggetti di prima classe .Potresti memorizzarli negli oggetti (variabili) e passarli come argomenti alle funzioni.Ogni funzione è in realtà un oggetto Function.

  2. gol è un oggetto, che viene inizializzato usando il OggettoLetterale notazione.


1) Nel codice seguente, qual è il ragionamento dietro a rendere gameOfLive una variabile e non solo una "funzione gameOfLife()"?


Le variabili definite a livello globale sono membri dell'oggetto finestra.Quindi, rendendola una variabile, rendi possibile l'uso della sintassi window.gameOfLife().Questo è anche il motivo per cui possono usare il file if (!window.gameOfLife) controlla all'inizio del tuo snippet.

Ma questo non spiega realmente perché abbiano scelto di farlo in questo modo, e una dichiarazione di funzione farebbe la stessa cosa. La risposta di Marcel Korpel spiega meglio il “perché” delle due opzioni.


2) cos'è il gol?Sembra un array, ma non ho familiarità con la sintassi o come si chiama.


La sintassi è chiamata notazione di oggetti compatti.Ciò che lo rende interessante qui è che l'oggetto "compatto" viene dichiarato all'interno di una funzione.Dichiarare un oggetto all'interno di una funzione come questa è utile perché puoi usarlo per creare oggetti javascript con membri (effettivamente) privati.

La chiave è ricordare che le funzioni e gli oggetti in javascript sono la stessa cosa.Quindi, il pieno gameOfLife() la funzione è in realtà una definizione di oggetto.Inoltre, il gol oggetto dichiarato come membro di gameOfLife è molto probabilmente parte di una tecnica comune per definire i membri privati.IL gameOfLife() la funzione/oggetto restituirà questo gol oggetto.Tutti gli altri elementi dichiarati all'interno del file gameOfLife() la funzione/oggetto diventa effettivamente membro privato del restituito gol istanza, mentre tutto ciò che è dichiarato all'interno del file gol l'oggetto stesso è pubblico.Quello che vogliono veramente fare alla fine è scrivere un codice come questo:

var game = new gameOfLife();

Ora, quando lo fanno, la variabile di gioco manterrà a gol oggetto.I metodi in questo oggetto hanno ancora accesso agli elementi dichiarati per intero gameOfLife() funzione, ma altro codice no (almeno, non così facilmente).Pertanto, tali elementi sono effettivamente privati.Elementi in gol l'oggetto stesso è ancora pubblico.Quindi hai un oggetto con membri sia privati ​​che pubblici per un corretto incapsulamento/occultamento delle informazioni, proprio come faresti con altri linguaggi orientati agli oggetti.


Mettere una funzione in una variabile consente di arrivare più tardi e sostituirlo con un'altra funzione, sostituisce la funzione in modo trasparente al resto del codice.Questa è la stessa cosa che stai facendo quando si specifica "onclick=" su un widget modulo.

SOLO: per spiegare la sintassi:

Le funzioni sono oggetti di prima classe in JavaScript, in modo da poter mettere una funzione in una variabile.Pertanto, la parte principale di questo codice è infatti una definizione funzione memorizzata in Var Gameoflife, che potrebbe essere successivamente utilizzato chiamando:

gameOfLife()
.

GOL è un oggetto (hash) e "init" è un altro esempio della sintassi sopra riportata, tranne che inserisci direttamente nel tasto "init" nell'hash "GOL".Quindi che a turno potrebbe essere chiamato da:

gol["init"](w,h)
.

Secondo Questa pagina , dichiarare gameOfLife nel modo non è diversoDichiarandolo a modo tuo.Il modo in cui definiscono gol lo rende un oggetto (o puoi pensarlo come un array associativo).Un collegamento simile per gli array è utilizzare parentesi quadre anziché parentesi graffe ricci.

Considerando una funzione come variabile può essere utile se si desidera una funzione di essere una proprietà di un oggetto.(Vedi: http://www.permadi.com/tutorial/jsfunc/index.html>

Credo che GOL sia un oggetto JavaScript descritto in coppie di nome / valore - molto simile al formato JSON.(Vedi: http://www.hunlock.com/blogs/mastering_json_(_javascript_object_notation_))

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top