Обозначение функции возражения? - PullRequest
1 голос
/ 22 февраля 2012

Мне было интересно, есть ли производительность / преимущество написания javascript в этом формате?

var myFuncs = {
  var firstFun = function() {
    // do something
  },

  var secondFunc = function() {
    // do something
  },

  var thirdFunc = function() {
    // do something
  }
}

Так их можно назвать как

myFuncs.firstFun();

Я пытаюсь понять, как это выгоднее [кроме читабельности кода]?

Ответы [ 2 ]

3 голосов
/ 22 февраля 2012

Функция против объявления объекта

Вы не можете использовать этот конкретный синтаксис, правильная форма:

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
0 голосов
/ 22 февраля 2012

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

Думайте об этом так. Если вы создадите глобальную функцию с именем init в библиотеке JavaScript и сделаете ее глобальной. Тогда, если кто-то сделает то же самое, он перезапишет ваш init. Но если вы поместите его в объект с именем someJSLibrary, шансы какого-либо другого кода, перезаписывающего ваши функции, будут намного меньше.

...