Функция против объявления объекта
Вы не можете использовать этот конкретный синтаксис, правильная форма:
var myFuncs = {
firstFn: function () {},
secondFn: function () {},
...
};
Преимущество написания функций внутри объекта связано с пространством имен и контекстом. Если вы написали:
var firstFn = function () {};
-or-
function firstFn() {}
функция будет определена как window.firstFn
. Добавление функций на myFuncs
делает функции доступными на window.myFuncs.firstFn
. Если вы хотите, чтобы ваш JavaScript работал с другими сценариями, вам бы не хотелось, чтобы ваша функция foo
конфликтовала с кем-то еще foo
function:
<script src="a.js">
function foo() {...}
</script>
<script src="b.js">
function foo() {...} //this script would overwrite the foo function in a.js
</script>
<script src="c.js">
var bar = { //this script would be accessed at bar.foo()
foo: function () {..}
}
</script>
Контекст вызова (this
) функции также будет другим:
function foo() {
console.log(this); //window
}
var bar = {
foo: function () {
console.log(this); //bar object
}
}
Синтаксис закрытия
Возможно, вас смущает синтаксис объявления функций внутри замыкания:
(function () {
var foo = function () {...};
foo();
}());
В этом случае закрытие используется для предотвращения загрязнения функцией глобальной области действия (window.foo
не будет установлено). Это позволяет нескольким сценариям использовать одни и те же имена функций, не беспокоясь о переопределении.
Синтаксис ООП
Синтаксис объекта часто используется для определения прототипа JavaScript-конструктора. В JS все функции можно вызывать как конструктор, просто используя ключевое слово new
при вызове функции:
function foo() {...}
var f = new foo(); //don't do it this way
Для удобства чтения / сопровождения / согласованности вы всегда должны называть свой конструктор, используя PascalCase:
function Foo() {...} //tells other developers this is a constructor
function bar() {...} //tells other developers this is a function
var f = new Foo();
var b = bar();
Не забывая слишком подробно о том, как работает прототип, вы можете назначить методы, которые будут совместно использоваться каждым экземпляром объекта функции, назначив объект свойству prototype
функции:
function Foo() {...}
Foo.prototype = { //note the use of the object declaration for the functions
bar: function () {...},
baz: function () {...},
...
};
var f = new Foo();
f.bar(); //calls the bar function that was defined in the prototype