Връщане на самоизпълняваща се анонимна функция

получи тази функция:

function Something(name){
   this.name = name;
}

var createSomething = (function() {
  function F(args) {
    return Something.apply(this, args);
  }
  F.prototype = Something.prototype;

  return function() {
    return new F(arguments);
  }
})();

var x = createSomething('abc');

Защо createSomething трябва да бъде самоизвикваща се функция?

Забелязах, че когато оставям извикващите скоби (), x просто ще бъде празен. Но защо?

Той извиква "незапитан" при инициализацията на javascript и след това се изпълнява отново, след като бъде "помолен". Но какъв е смисълът от първото бягане? Правилно ли присвоява "това" правилно или какъв е смисълът от употреба?


person DavidCockerfield    schedule 14.09.2014    source източник
comment
createSomething е function(){return new F(arguments)}   -  person slebetman    schedule 14.09.2014


Отговори (1)


Защо createSomething трябва да бъде самоизвикваща се функция?

createSomething не е самоизвикваща се функция, но съхранява резултата от самоизвикваща се функция. Самоизвикващите се функции също са известни като IIFE в света на javascript. Предлагам ви да прочетете това, за да разберете по-добре.

Забелязах, че когато оставям извикващите скоби (), x просто ще бъде празен. Но защо?

Той няма да е празен, а по-скоро ще сочи към неназован функционален обект. вероятно имаш предвид, че няма да даде очаквания резултат.

Той извиква "незапитан" при инициализацията на javascript и след това се изпълнява отново, след като бъде "помолен". Но какъв е смисълът от първото бягане? Правилно ли присвоява "това" правилно или какъв е смисълът от употреба?

При първото изпълнение неназованата функция създава нова функция (която след това се присвоява на createSomething). Тази новосъздадена функция (която е посочена от createSomething) след това се извиква с 'abc', няма второ изпълнение на IIFE.

Другото нещо, което трябва да се отбележи е, че function F е достъпен само за новосъздадената функция. Основният механизъм за това се нарича затваряне. Бих ви предложил да разберете тези основни концепции (свързани в този отговор), за да получите по-добра картина.

person Prabhu Murthy    schedule 14.09.2014
comment
Разбирам. Благодаря ти. Чел съм за модела на модула и преди, обаче, когато някой заяви, че е създаден в рамките на модел на модул, за да не замърсява глобалното пространство от имена, звучи малко странно. тъй като, в случай че е дефинирано в рамките на функция, без значение дали е модул или не, то така или иначе няма да замърси пространството от имена, освен че е дефинирано над контекста и не е дефинирано в нова функция/модул. Или съм наваксал нещо нередно там? - person DavidCockerfield; 14.09.2014