IIFE+модули проблем


1

Разучавам сега IIFE и модули. Опитвам разни неща, но се запънах.

(function() { return function theCar() { var car = { engine: 'good', year: 1999 }; console.log(car); } console.log(car); }());

Не ми принтира данните на car. Нито във вътрешната функция, нито във външната(която даже опитах да я присвоя към някаква променлива  и да я console.log-на, за да ми върне инфото за car. Т.е. цялото iife да е var x= ...). Дебъгвах, но пак не разбрах защо не става. Какво пропускам?


П.С. Прекалявам ли като поствам отделна тема специално за такъв въпрос? Мисълта ми е да не задръствам форума. Щото ако тръгна за (почти) всяко нещо да удрям на камък и да пиша тук, къде ще му излезе края? Има ли нещо такова?



Отговори



3

Здравей,

има няколко варианта да си принтираш данните.

Като за начало, вторият console.log(car) е unreachable code, тъй като преди това return-ваш.

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

var a = (function() {

return function theCar() {
var car = {
engine: 'good',
year: 1999
};
console.log(car);
}

}());


a();

2 начин) IIFE-то да не return-ва функция, а само да я декларира и след това да я извика:

(function() {

function theCar() {
var car = {
engine: 'good',
year: 1999
};
console.log(car);
}
theCar();

}());

Сигурно има и други. Ще ги допиша като ги разцъкам :)

EDIT:

3 начин)

(function() {

var result = function theCar() {
var car = {
engine: 'good',
year: 1999
};
return car;
};
return console.log(result());

}());


от kalin.dimchev (645 точки)


0

Благодаря, колега! Изненадващо просто е...

Искам само да попитам и следното:

IIFE е в скоби, за да е function expression(за да работи) и след него има пак скоби(за да се извика). Въпросът ми е - как така работят тези 2 скоби накрая, че да се извиква функцията?

Според мен, понеже функцията се пише function(), то целият function expression си е просто стандартна функция, но в първата си половина има доста код(още функции и променливи). 

EDIT:

 И защо в първия вариант, IIFE-то не се изпълнява автоматично, а трябва чрез променлива да го викам? А във втория вариант - цялата функция се вика отново? Нали е Immediately Invoked? Аз под това разбирам, че където и както го напиша, то трябва да тръгне. Макар и еднократно, ако не е вързано с променлива, която да викам. Уж последните 2 скоби са именно за да се вика функцията.

Накратко, представям си го така - (код с функция)(скоби за незабавно изпълнение). А излиза, че в първите 2 скоби трябва да пъхам console.log или да викам пак целия метод накрая, което сякаш обезмисля последните 2 скоби. Но пък без тях получавам пак Syntax Error. 

Или цялата анонимна функция(в първите скоби) е самата дефиниция, превърната в expression. И вторите скоби са, за да си запази вида на функция. Защото функциите накрая винаги имат (). Май е заради това.


от Bruno (921 точки)


2

 Проблема ти е в return. Кода след return просто не се изпълнява.

Това е не само при IIFE, не само при JavaScript, а при всички програмни езици(предполоагам)


от ivan.mihov1 (4988 точки)


0

Уж знам, че след това, което връща return, кодът нататък се пренебрегва, ама...

Стряскащо е как такива основни неща понякога спъват цялата работа. Или просто не ги знам толкова добре, колкото си мисля.

 

от Bruno (921 точки)

0

 Като си поблъскаш половин час главата на някоя глупост, се запомня най-добре :)


от ivan.mihov1 (4988 точки)