Что Вы называете этим синтаксисом JavaScript, таким образом, я могу исследовать его?

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*");
            }
        },
    }
}

8
задан Johan - reinstate Monica 28 May 2011 в 23:13
поделиться

7 ответов

var gameOfLife = function() { }

является выражением функции, тогда как

function gameOfLife() { }

является объявлением функции.

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

Существует тонкая разница в поведении деклараций и выражений.

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

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

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

Общий случай использования этих условно определенных функций - расширение функциональности 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, пытаются указать имя переменной, которой была назначена функция, но поскольку отладчику приходится догадываться об этом, разбирая содержимое сценария на лету, это может быть слишком сложно (в результате вместо имени функции отображается (?)()) или даже неправильно.

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

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

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

15
ответ дан 5 December 2019 в 04:54
поделиться

конечно: чтобы объяснить синтаксис:

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

gameOfLife()

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

gol["init"](w,h)
1
ответ дан 5 December 2019 в 04:54
поделиться

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

1
ответ дан 5 December 2019 в 04:54
поделиться

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

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

0
ответ дан 5 December 2019 в 04:54
поделиться

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


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

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


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


Синтаксис называется компактной объектной нотацией. Интересным здесь является то, что "компактный" объект объявляется внутри функции. Объявление объекта внутри функции полезно, потому что с его помощью можно создавать объекты javascript с (фактически) закрытыми членами.

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

var game = new gameOfLife();

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


4
ответ дан 5 December 2019 в 04:54
поделиться

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

2
ответ дан 5 December 2019 в 04:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: