Преимущество JavaScript в размещении функций внутри переменных? - PullRequest
9 голосов
/ 17 февраля 2011

Я видел недавние примеры кода, помещающие функции в переменные и затем вызывающие функции как обычно.

Как в:

var myFunctionName = function() {
    Code Here...
}

myFunctionName();

Я уверен, что есть много преимуществболее продвинутые сценарии, но мне просто любопытно.

Ответы [ 3 ]

12 голосов
/ 17 февраля 2011

Нет никаких преимуществ, вы не помещаете функцию в переменную, вы просто называете функцию по-разному.

function foo() { /* ... */ }
var foo = function () { /* ... */ }

Они абсолютно одинаковы, за исключением одной вещи.

Это работает:

foo("Hello!");
/* Later on... */
function foo() { /* ... */ }

Это не работает:

foo("Hello!");
/* Later on... */
var foo = function () { /* ... */ }

Интерпретатор JavaScript предварительно обрабатывает все function foo перед запуском и нажимает ихв начало программы, чтобы они были доступны, но не будут делать это с var foo = function.

5 голосов
/ 17 февраля 2011

Это называется выражением функции, поведение которого немного отличается от объявления функции.Среди прочего, он действует по-другому, когда речь идет о том, когда вы можете обратиться к нему.Например, если вы делаете:

var myFunctionName = function() {
    Code Here...
}

Вы не можете вызывать или ссылаться на функцию до тех пор, пока вам не назначат, тогда как

function myFunctionName() {
    Code Here...
}

Можно ссылаться где угодно в той же области, даже до того, как это объявлено.Это происходит из-за функции в Javascript, называемой «подъем», где все объявления функций перемещаются в верхнюю часть блока кода за кулисами.

См. Также:

В чем разница между выражением функции и объявлением в JavaScript?

http://www.adequatelygood.com/2010/2/JavaScript-Scoping-and-Hoisting

2 голосов
/ 17 февраля 2011

Есть некоторые вещи, которые вы можете сделать с помощью выражения функции, которые вы не можете сделать с помощью объявления.

  • оно может быть немедленно вызвано, а возвращаемое значение сохранено в переменной

  • если вы не находитесь в глобальном пространстве имен, вы можете исключить ключевое слово var, чтобы создать глобальное


EDIT:

Вот пример немедленного вызова.Он возвращает функцию в переменную myFunctionName, которая имеет доступ к переменным и параметру, находящимся в области действия в немедленно вызываемой функции.

var myFunctionName = function( v ) {
       // do something with "v" and some scoped variables
       // return a function that has access to the scoped variables

    return function() {
        // this function does something with the scoped variables
    };
}( 'someVal' );

  // now this function is the only one that has access
  //   to the variables that were scoped in the outer expression.
myFunctionName();

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

Пример: http://jsfiddle.net/5uuLa/1/

var counter = function( value ) {

    return function( addValue ) {
        value += ~~addValue;
        return value;
    };
}( 10 ); // initialize with a value

   // each call builds on the result of the previous    
console.log( counter( 2 ) ); // 12
console.log( counter( 5 ) ); // 17
console.log( counter( 3 ) ); // 20
console.log( counter( 7 ) ); // 27
console.log( counter( 1 ) ); // 28
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...