Когда вкладывать функции в javascript?

Если я не беспокоюсь о загрязнении глобальной области видимости, и единственное место, откуда вызывается функция b(), — это функция a(), какое из следующих решений с точки зрения производительности является лучшим решением?

var v;
function a()
{
    function b()
    {
        v*=v;
    }
    v=5;
    b();
}
a();

or

var v;
function a()
{
    v=5;
    b();
}
function b()
{
    v*=v;
}
a();

person pishpish    schedule 15.06.2013    source источник
comment
Первый вариант как раз подходит.   -  person Shiplu Mokaddim    schedule 15.06.2013
comment
Я на 99,9% уверен, что это не является узким местом в производительности во всем, что вы делаете, поэтому не используйте его в качестве основы для выбора того, какой из них использовать.   -  person JJJ    schedule 15.06.2013
comment
Проверьте это: stackoverflow.com/questions/7295634/javascript-nested-function   -  person karthikr    schedule 15.06.2013


Ответы (2)


Когда вы используете символ, связанное с ним значение ищется в цепочке сред, начиная с внутренней и двигаясь наружу. Это означает, что внутренняя (локальная) среда обнаруживается первой, а не глобальная, но реальной разницы в производительности нет.

Чтобы выбрать, какое решение принять, просто спросите себя:

  • внутренняя функция может быть полезна для какой-то другой функции в будущем?

а если нет,

  • могу ли я абстрагировать внутреннюю функцию таким образом, чтобы создать более общую функцию, которая могла бы быть полезна в другом месте?
person Domenico De Felice    schedule 15.06.2013
comment
а что, если var v не была глобальной, а передавалась внутренней функции? - person pishpish; 17.06.2013
comment
Если v передается внутренней функции в качестве аргумента, вы переходите от подхода с побочными эффектами к функциональному подходу, это почти всегда лучше. Вы достигаете того же результата, не манипулируя глобальной переменной, а манипулируя аргументами вашей функции. С точки зрения производительности разницы пока нет. Формальный параметр v будет находиться в самой внутренней среде (локальной среде внутренней функции). Он будет найден первым, чем внешняя и глобальная среда. Но опять же, на производительность это не влияет, важны другие вещи. - person Domenico De Felice; 20.06.2013

Глядя на свой вопрос три года спустя, я хочу дать более удовлетворительный ответ.

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

function a(){
  // ...
}
function b(){
  // ...
  a();
}

a();
b();

Если внутренняя функция не будет использоваться где-либо еще, вложите ее. Это выглядит чище и повышает логическую целостность внешней функции (соответствующие элементы визуально заключены).

function b(){
  function a(){
    // ...
  }

  // ...
  a();
}

b();

Если внутренняя функция не будет использоваться где-либо еще, а внешняя функция будет вызываться более одного раза, сделайте из нее замыкание и определите внутреннюю в закрытой области. Таким образом, она не будет переопределена. при каждом вызове. Это имеет больше смысла, когда внутренняя функция сложна и/или внешняя функция вызывается много раз.

var b = (function b(){
  function a(){
    // ...
  }

  return function(){
    // ...
    a();
  };
}());

b();
b();

Другие воздействия на производительность незначительны.

person pishpish    schedule 21.10.2016