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