Как из IIFE функции передать параметр в другую IFFE функцию?
В app.init (в последней строчке этого метода) мне нужно передать параметры (moviesList, rowMoviesToShow, rowMoviesHeight, maxItemsInRow) в модуль More. Пробую сделать это так:
//модуль more
const more = (function(moviesList, rowMoviesToShow, rowMoviesHeight, maxItemsInRow){
return {
init: function(){
btnMore.addEventListener('click', this.addMoviesRow);
},
addMoviesRow: function () {
let arrMoviesItems = [...moviesList.children],
activeMovies = app.mainMethods.getActiveMovies(arrMoviesItems).length,
maxRows = Math.ceil(activeMovies / maxItemsInRow),
maxHeightMoviesRows = maxRows * rowMoviesHeight;
if ((moviesList.offsetHeight + (rowMoviesHeight * rowMoviesToShow) >= maxHeightMoviesRows)) {
moviesList.style.height = maxHeightMoviesRows + 'px';
btnMore.style.backgroundColor = 'black';
btnMore.style.cursor = 'auto';
btnMore.removeEventListener('click', addMoviesRow);
}
else {
moviesList.style.height = moviesList.offsetHeight + (rowMoviesHeight * rowMoviesToShow) + 'px';
}
}
}
})(moviesList, rowMoviesToShow, rowMoviesHeight, maxItemsInRow)
//app
const app = (function(){
const moviesList = document.querySelector('.movies-list'),
moviesItem = document.querySelector('.movies-list__item');
let rowMoviesToShow = 2,
rowMoviesHeight = moviesItem.offsetHeight + 30,
maxItemsInRow = Math.floor(moviesList.offsetWidth / moviesItem.offsetWidth);
return {
init: function(){
_this = this;
document.addEventListener("DOMContentLoaded", function () {
moviesName.forEach(_this.mainMethods.lineBreak);
if (window.screen.width >= 992) {
moviesList.style.overflow = 'hidden';
moviesList.style.height = rowMoviesHeight * rowMoviesToShow + 'px';
}
search.init();
more.init(moviesList, rowMoviesToShow, rowMoviesHeight, maxItemsInRow);
})
},
mainMethods: {
lineBreak: function(element){
if (element.innerText.length >= 26) {
element.innerText += ', ';
element.style.display = 'inline';
}
},
getActiveMovies: function(arrMoviesItems) {
let arr = [];
for (let i = 0; i <= arrMoviesItems.length - 1; i++) {
if (!arrMoviesItems[i].classList.contains('hidden')) {
arr.push(arrMoviesItems[i]);
}
}
return arr;
}
},
mainProps: {
}
}
})();
app.init();
Но в итоге в модуле more все эти параметры undefined. (Uncaught ReferenceError: moviesList is not defined)
Если переменные, которые я хочу передать в more, вынести из app. Т.е. так:
const moviesList = document.querySelector('.movies-list');
let rowMoviesToShow = 2,
rowMoviesHeight = moviesItem.offsetHeight + 30,
maxItemsInRow = Math.floor(moviesList.offsetWidth / moviesItem.offsetWidth);
const app = (function(){/*...some code*/})()
То все работает и параметры уже не undefined.