Каждый раз, когда выполняется основная часть внешней функции и запускаются строки:
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
несколько раз .