2016-07-27 11 views
-1

У меня возникли проблемы обертывание моей головы вокруг этого (предполагая, что я что-то там быть diffirence в вызове анонимной функции непосредственно или вызывать его переменным отсутствую.Дифференциация между вызовом анонимной функции напрямую и ее вызовом переменной?

Почему в примере ниже 0 установить переменную ' общий?

var adder = function (total) { 

    // the following function is returned 
    // and assigned to adder 
    var inner_function = function (summand) { 
     total += summand; 
     alert(total); 
    } 

    return inner_function; 

}(0); 

adder(2); // returns 2 
adder(3); // returns 5 

Но не тогда, когда я называю эту анонимную функцию потом, как так?

var adder = function (total) { 

    // the following function is returned 
    // and assigned to adder 
    var inner_function = function (summand) { 
     total += summand; 
     alert(total); 
    } 

    return inner_function; 

} 

adder(0); 
adder(2); // -> 2 
adder(3); // -> 5 
+0

Ну, вы можете повторно использовать переменную снова и снова ... –

+2

Вы уверены, что ваш второй пример ничего не предупреждает? [JSFiddle] (https://jsfiddle.net/dm74ny9o/). Также, если вы хотите добавить значения, сохраните копию текущего значения и обновите это значение. [Пример скрипта] (https://jsfiddle.net/hqbd02ej/) – Rajesh

+0

Теперь я понимаю свою ошибку, в первом фрагменте кода результат сразу возвращается к переменному «сумматор», тогда как при вызове сумматора (0) результат не сохраняется нигде, функция просто вызвана. Когда во втором фрагменте кода я бы сделал: adder = сумматор (0), вторая часть кода также отлично работает – Jackques

ответ

3

у вас есть две функции.

В первом примере вы назначаете возвращаемое значение (т. внутренняя анонимная функция) внешней анонимной функции до adder.

Во втором примере вы назначаете внешнюю анонимную функцию на adder.

Поскольку значение в каждом случае имеет значение adder, вы получаете разные результаты.

+0

Что я не понимаю, так это то, что в первом фрагменте кода я вызываю функцию (с (0) , немедленно вызываемый), он выполняет и возвращает внутреннюю функцию. Но в моей второй части кода я также вызываю функцию (с сумматором (0);), поэтому я ожидаю, что функция inner_function также вернется? Почему немедленно вызывает или вызывает его позже, чтобы сделать разницу в этом скрипте? – Jackques

+0

@Jackques - Он делает ... и тогда вы отбрасываете его, не называя его. Вы никогда не назначаете это возвращаемое значение ни на что (тогда как в первом примере вы назначаете его «сумматору») – Quentin

+0

Теперь я понимаю свою ошибку, в первом фрагменте кода результат сразу возвращается к переменной «сумматор», тогда как когда вызывающий сумматор (0), результат не сохраняется нигде, функция просто вызывается. Когда во втором фрагменте кода я бы сделал: adder = сумматор (0), второй фрагмент кода также отлично работает – Jackques

1

В вашей первой части кода вы вызываете функцию, когда вы закрываете тело функции с помощью функции '(0)', которая называется функцией self invoking. Таким образом, в обоих примерах кода вы фактически вызываете свою функцию три раза.

function(){}(): это также объявление функции и самоисключение.

function(){}: это просто объявление функции.

1

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

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

Попробуйте это:

adder = adder(0)

Здесь вы переопределить первоначальную функцию с внутренним одной

1

В первом примере вы Asign сумматор результат анонимной функции, то есть внутренняя функция + scope (где total = 0).

Это потому, что вы вызываете анонимную функцию с (0) в конце.

вы должны видеть функциональный блок, как это именованная функция, так что было бы:

var adder = myfun(0); 

var myfun = function(total){...} 


Before statement is exacly the same as: 

var adder = function(total){...}(0); 

То, что вы делаете.

1

Это довольно просто: вы указываете в своих примерах две разные вещи: adder.

В вашем первом примере вы вызываете анонимный номер function (total) {...}, поэтому вы присваиваете его возвращаемое значение adder, что составляет inner_function.

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

+0

Вот что [ответ @ Quentin] (http://stackoverflow.com/a/38612627/2897426) уже говорит ... –

 Смежные вопросы

  • Нет связанных вопросов^_^