Как называется этот синтаксис JavaScript, чтобы я мог его исследовать? - PullRequest
8 голосов
/ 09 июля 2010

1) В следующем коде, что является причиной для gameOfLive переменной, а не просто function gameOfLife()?

2) Что такое gol?Это похоже на массив, но я незнаком с синтаксисом или как он называется.

Я изучаю 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*");
            }
        },
    }
}

Ответы [ 7 ]

15 голосов
/ 09 июля 2010
  1. В JavaScript функциями являются объекты первого класса . Вы можете хранить их в объектах (переменных) и передавать их в качестве аргументов функциям. Каждая функция на самом деле является Function объектом.

  2. gol - это объект, который инициализируется с использованием литерал объекта .

15 голосов
/ 09 июля 2010
var gameOfLife = function() { }

- это выражение функции , тогда как

function gameOfLife() { }

- это объявление функции .

Цитировать Юрия 'kangax'Зайцев о Выражения функций и объявления функций :

В поведении объявлений и выражений есть небольшая разница.

Прежде всего, объявления функций анализируются иоценивается, прежде чем любые другие выражения.Даже если объявление расположено последним в источнике, оно будет оцениваться , прежде всего любые другие выражения , содержащиеся в области видимости.[…]

Другая важная особенность объявлений функций заключается в том, что их условное объявление не стандартизировано и варьируется в зависимости от среды.Вы никогда не должны полагаться на то, что функции объявляются условно, и вместо них следует использовать выражения функций.

В этом случае, как упоминает Джоэль Коухорн в комментарии, gameOfLife определяется условно, поэтому необходимо использовать функциюexpression.

Общий вариант использования этих условно определенных функций заключается в расширении функциональности JavaScript в браузерах, которые не имеют встроенной поддержки новых функций (недоступно в предыдущих версиях ECMAScript / JavaScript).Вы не хотите делать это с помощью объявлений функций, так как они все равно перезаписывают встроенную функциональность, что, скорее всего, не то, что вы хотите (учитывая скорость и т. Д.).Краткий пример этого:

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

Одним из основных недостатков выражений функций является то, что вы фактически назначаете анонимную функцию переменной.Это может усложнить отладку , так как имя функции обычно не известно, когда выполнение скрипта останавливается (например, на заданной вами точке останова).Некоторые JavaScript-отладчики, такие как Firebug, пытаются дать имя переменной, которой была назначена функция, но поскольку отладчик должен угадать это, анализируя содержимое скрипта на лету, это может быть слишком сложно (что приводит к(?)() отображается вместо названия функции) или даже ошибается.

(например, читайте на странице, хотя ее содержание не совсем подходит для начинающих)

4 голосов
/ 09 июля 2010

1) В следующем коде, что является причиной того, что gameOfLive является переменной, а не просто «функцией gameOfLife ()»?


Переменные, определенные на глобальном уровне, являются членами объекта окна. Таким образом, делая его переменной, вы позволяете использовать синтаксис window.gameOfLife(). Именно поэтому они могут использовать проверку if (!window.gameOfLife) в начале вашего фрагмента.

Но это на самом деле не объясняет, почему они решили сделать это таким образом, и объявление функции сделало бы то же самое. Ответ Марселя Корпеля лучше объясняет «почему» двух вариантов.


2) что такое гол? Это похоже на массив, но я не знаком с синтаксисом или его названием.


Синтаксис называется нотацией компактных объектов. Здесь интересно то, что «компактный» объект объявлен внутри функции. Объявление объекта внутри такой функции полезно, потому что вы можете использовать его для создания объектов JavaScript с (эффективно) закрытыми членами.

Ключ должен помнить, что функции и объекты в javascript - это одно и то же . Таким образом, полная функция gameOfLife() действительно является определением объекта. Кроме того, объект gol, объявленный в качестве члена gameOfLife, скорее всего, является частью общей техники определения частных членов. Функция / объект gameOfLife() вернет этот объект gol. Все остальные элементы, объявленные внутри функции / объекта gameOfLife(), по сути, становятся частными членами возвращенного экземпляра gol, тогда как все, объявленное внутри самого объекта gol, является открытым. Что они действительно хотят сделать, так это написать код:

var game = new gameOfLife();

Теперь, когда они это сделают, переменная игры будет содержать объект gol. Методы в этом объекте все еще имеют доступ к элементам, объявленным в полной функции gameOfLife(), но другой код не имеет (по крайней мере, не так легко). Таким образом, эти предметы фактически являются частными. Элементы в самом объекте gol все еще общедоступны. Таким образом, у вас есть объект как с закрытыми, так и с открытыми членами для правильной инкапсуляции / сокрытия информации, как если бы вы строили с другими объектно-ориентированными языками.


2 голосов
/ 09 июля 2010

Помещение функции в переменную позволяет вам прийти позже и заменить ее другой функцией, прозрачно заменяя функцию для остальной части кода. Это то же самое, что вы делаете, когда указываете «onClick =» в виджете формы.

1 голос
/ 09 июля 2010

Согласно этой странице , объявление gameOfLife по-своему ничем не отличается от объявления его по-вашему. То, как они определяют gol, делает его объектом (или вы можете думать о нем как о ассоциативном массиве). Аналогичный ярлык для массивов - использовать квадратные скобки вместо фигурных скобок.

1 голос
/ 09 июля 2010

обязательно: для объяснения синтаксиса:

функции являются объектами первого класса в javascript, поэтому вы можете поместить функцию в переменную.таким образом, основная часть этого кода на самом деле является определением функции, хранящимся в var gameOfLife, которое позже можно было бы использовать, вызвав:

gameOfLife()

gol - это объект (хеш), а "init" - другой пример.вышеупомянутого синтаксиса, за исключением того, что помещается непосредственно в ключ "init" в хеше "gol". чтобы функция могла быть вызвана:

gol["init"](w,h)
0 голосов
/ 09 июля 2010

Рассмотрение функции как переменной может быть полезно, если вы хотите, чтобы функция была свойством объекта. (См .: http://www.permadi.com/tutorial/jsFunc/index.html)

Я полагаю, что gol - это объект JavaScript, описанный парами имя / значение - во многом как формат JSON (См .: http://www.hunlock.com/blogs/Mastering_JSON_(_JavaScript_Object_Notation_))

...