Question

1) Dans le code suivant, quel est le raisonnement derrière faire gameOfLive une variable et pas seulement function gameOfLife()?

2) qu'est-Ce que gol?Il semble comme un tableau, mais je suis pas familier avec la syntaxe ou ce que son nom.

Je suis étudiant 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*");
            }
        },
    }
}
Était-ce utile?

La solution

var gameOfLife = function() { }

est un expression de fonction, tandis que

function gameOfLife() { }

est un déclaration de la fonction.

Pour citer Juriy ‘kangax’ Zaytsev sur Les expressions de fonction vsLes déclarations de fonction:

Il y a une différence subtile dans le comportement des déclarations et les expressions.

Tout d'abord, les déclarations de fonction sont analysées et évaluées avant tout d'autres expressions sont.Même si la déclaration est placé en dernier dans un source, il sera évalué d'abord toutes les autres expressions contenue dans un champ.[...]

Un autre trait important de la fonction les déclarations, c'est que les déclarant conditionnellement non-normalisés et varie à travers différents environnements.Vous ne devez jamais compter sur les fonctions d'être déclaré de façon conditionnelle et de l'utilisation les expressions de fonction à la place.

Dans ce cas, comme Joel Coehoorn mentionne dans un commentaire, gameOfLife est définie de façon conditionnelle, il est donc nécessaire d'utiliser une expression de fonction.

Un général de cas d'utilisation pour ces conditionnellement fonctions définies est d'améliorer la fonctionnalité JavaScript dans les navigateurs qui n'ont pas de support natif pour les nouvelles fonctions (pas disponible dans les précédents ECMAScript/JavaScript versions).Vous ne voulez pas faire cela à l'aide de déclarations de fonction, comme ceux qui vont remplacer les fonctionnalités natives de toute façon, qui n'est probablement pas ce que vous voulez (en tenant compte de la vitesse, etc.).Un court exemple de cette:

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

Un inconvénient majeur d'expressions de fonction, c'est que vous, en effet, attribuer une fonction anonyme à une variable.Cela peut faire le débogage plus difficile, comme le nom de la fonction est généralement pas connue lors de l'exécution du script s'arrête (par exemple, sur un point d'arrêt que vous définissez).Certains JavaScript, des débogueurs, comme Firebug, essayez de donner le nom de la variable, la fonction a été attribué, mais comme le débogueur doit deviner ce par l'analyse du contenu du script à la volée, ce qui peut être trop difficile (d'où une (?)() d'être montré, au lieu d'un nom de fonction) ou même être mauvais.

(pour des exemples, lire la suite sur la page, même si son contenu n'est pas entièrement adapté pour les débutants)

Autres conseils

  1. En JavaScript, les fonctions sont des objets de première classe.Vous pouvez stocker dans des objets (variables) et les passer comme arguments des fonctions.Chaque fonction est en fait un Function objet.

  2. gol est un objet, qui est en cours d'initialisation à l'aide de la objet littéral la notation.


1) Dans le code suivant, quel est le raisonnement derrière faire gameOfLive une variable et non pas seulement une "fonction gameOfLife()"?


Les Variables définies au niveau mondial sont les membres de la fenêtre de l'objet.Donc en faisant une variable, vous faites, il est possible d'utiliser la syntaxe window.gameOfLife().C'est aussi pourquoi ils peuvent utiliser le if (!window.gameOfLife) vérifier au début de votre code.

Mais qui n'a pas vraiment expliquer pourquoi ils ont choisi de faire de cette façon, et d'une déclaration de fonction serait de faire la même chose. Marcel Korpel réponse explique mieux le "pourquoi" de ces deux options.


2) qu'est-ce que gol?Il semble comme un tableau, mais je suis pas familier avec la syntaxe ou ce que son nom.


La syntaxe est appelé compact object notation.Ce qui le rend intéressant ici, c'est que le "compact" de l'objet est déclarée à l'intérieur d'une fonction.Déclaration d'un objet à l'intérieur d'une fonction comme ceci est utile parce que vous pouvez l'utiliser pour construire des objets en javascript avec (efficacement) les membres privés.

La clé est de se rappeler que les fonctions et les objets en javascript sont la même chose.Par conséquent, le gameOfLife() la fonction est vraiment une définition de l'objet.En outre, l' gol objet déclaré en tant que membre de gameOfLife est le plus probablement d'une technique courante pour la définition des membres privés.L' gameOfLife() fonction/objet sera de retour cette gol objet.Tous les autres éléments déclarés à l'intérieur de la gameOfLife() fonction/objet de devenir effectivement des membres privés de la renvoyé gol exemple, alors que tout déclarée à l'intérieur de la gol objet lui-même est public.Ce qu'ils veulent vraiment faire est finalement écrire du code comme ceci:

var game = new gameOfLife();

Maintenant, quand ils font ça, le jeu tiendra une variable gol objet.Les méthodes de cet objet ont encore accès à des éléments déclarés dans le plein gameOfLife() la fonction, mais d'autres ne contient pas de code (au moins, pas aussi facilement).Ainsi, ces éléments sont effectivement privés.Articles dans la gol objet lui-même sont toujours publics.Donc, vous avez un objet avec les deux membres publics et privés pour une bonne encapsulation/se cacher de l'information, comme vous le feriez pour construire avec d'autres langages orientés objet.


Mettre une fonction dans une variable vous permet de venir plus tard et de la remplacer par une autre fonction, en remplacement de la fonction de manière transparente pour le reste de votre code.C'est la même chose que vous faites lorsque vous spécifiez "onClick=" sur une forme de widget.

assurez-vous:pour expliquer la syntaxe:

les fonctions sont des objets de première classe en javascript, donc vous pouvez mettre une fonction dans une variable.ainsi, la partie principale de ce code est en fait la définition d'une fonction stockée dans le var gameOfLife, qui pourrait ensuite être utilisé en appelant:

gameOfLife()

gol est un objet (hash), et "init" est un autre exemple de la syntaxe ci-dessus, à l'exception de placer directement dans le "init" dans le "gol" de hachage.donc que la fonction pourrait être convoquée par:

gol["init"](w,h)

Selon cette page, en déclarant gameOfLife dans leur façon de faire n'est pas différent de déclarer à votre façon.La façon dont ils définissent gol en fait un objet (ou vous pouvez penser que c'est un tableau associatif).Une semblable raccourci pour les tableaux est d'utiliser des crochets à la place des accolades.

En considérant une fonction d'une variable peut être utile si vous souhaitez une fonction à une propriété d'un Objet.(Voir: http://www.permadi.com/tutorial/jsFunc/index.html)

Je crois gol est un objet JavaScript décrit dans les paires nom/valeur -- tout comme le format JSON.(Voir: http://www.hunlock.com/blogs/Mastering_JSON_(_JavaScript_Object_Notation_))

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top