Как вы называете этот синтаксис JavaScript, чтобы я мог его изучить?

StackOverflow https://stackoverflow.com/questions/3208236

  •  13-09-2020
  •  | 
  •  

Вопрос

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*");
            }
        },
    }
}
Это было полезно?

Решение

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

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

Другие советы

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

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


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


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

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

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

gameOfLife()

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

gol["init"](w,h)

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top