Область действия и сохранение состояния переменной при самостоятельном вызове анонимной функции и анонимной функции - PullRequest
1 голос
/ 13 марта 2020

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

var selfInvokingfunc= (function () {
    var a=2;
    var myprivatefunction = function () {
        a=a+2;
        console.log(a);

    }
    return {
        mypublicfunction : function () {
            myprivatefunction();
        }
    }
})();

selfInvokingfunc.mypublicfunction() ;//a is 4
selfInvokingfunc.mypublicfunction();  // a is 6

var nonSelfInvokingAnonymousFunction = function () {
    var a=2;
    var myprivatefunction = function () {
        a=a+2;
        console.log(a);
    }

    return {
        mypublicfunction : function () {
            myprivatefunction();
        }
    }
};

nonSelfInvokingAnonymousFunction().mypublicfunction(); //a is 2
nonSelfInvokingAnonymousFunction().mypublicfunction(); //a is 2

То же самое отлично работает для не-самостоятельного вызова, если вызывается как:

var temp=nonSelfInvokingAnonymousFunction();
temp.mypublicfunction() ; // a is 4
temp.mypublicfunction(); // a is 6

Пожалуйста, помогите мне понять то же самое.

1 Ответ

0 голосов
/ 13 марта 2020

Каждый раз, когда выполняется основная часть внешней функции и запускаются строки:

var a=2;
var myprivatefunction = function () {
// ...

, в памяти создается новая привязка для этих переменных.

При использовании self - вызывая функцию, поскольку она выполняется немедленно и один раз , тогда существует одна привязка для переменной a, которую свойство mypublicfunction может видеть через замыкание.

Напротив, с вашим nonSelfInvokingAnonymousFunction, каждый раз, когда вы вызываете его, вы создаете отдельную привязку для a:

nonSelfInvokingAnonymousFunction().mypublicfunction(); //a is 2
// ^^^ creates an a           ^^^^
nonSelfInvokingAnonymousFunction().mypublicfunction(); //a is 2
// ^^^ creates a SEPARATE a   ^^^^

Когда у вас есть две отдельные привязки для переменной a, вызов mypublicfunction для функции, которая закрывает одну привязок, не будет влиять на другую привязку.

В вашем последнем коде, когда вы делаете

var temp = nonSelfInvokingAnonymousFunction();
//         ^^^ creates an a           ^^^^
temp.mypublicfunction() ; // a is 4
temp.mypublicfunction(); // a is 6

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

...