在JavaScript中传递参数时出现问题
我有一个带幻灯片库的整版lightbox,我正在尝试重构我的代码,这样我就不必使用全局变量。在函数之间传递一个变量作为参数时,我遇到了困难。当我打开lightbox gallery时,一切都很好:正确的图像被看到,计数器中的数字被显示出来。当我想切换到下一个或上一个图像时,问题就开始了。我无法访问存储或存储lightbox打开时看到的当前图像的变量。 我正在发布没有变量声明的简化代码在JavaScript中传递参数时出现问题,javascript,parameter-passing,Javascript,Parameter Passing,我有一个带幻灯片库的整版lightbox,我正在尝试重构我的代码,这样我就不必使用全局变量。在函数之间传递一个变量作为参数时,我遇到了困难。当我打开lightbox gallery时,一切都很好:正确的图像被看到,计数器中的数字被显示出来。当我想切换到下一个或上一个图像时,问题就开始了。我无法访问存储或存储lightbox打开时看到的当前图像的变量。 我正在发布没有变量声明的简化代码 // This is a function which opens the lightbox with the
// This is a function which opens the lightbox with the galery after clicking on a thumbnail image.
function openSlideshowLightbox (event, currentSlide) {
for (const [currentThumbnailImg] of thumbnailImgs.entries()) {
if (event.target === thumbnailImgs[currentThumbnailImg]) {
showCurrentSlide(currentSlide = currentThumbnailImg)
}
}
}
// This function shows the current slide containing an image
function showCurrentSlide (currentSlide) {
for (const slide of slides) {
if (slide.classList.contains('slide_visible')) {
slide.classList.remove('slide_visible')
slide.classList.add('slide_hidden')
} else {
slide.classList.add('slide_hidden')
}
}
slides[currentSlide].classList.remove('slide_hidden')
slides[currentSlide].classList.add('slide_visible')
}
所有这些都是一个动作,lightbox打开,函数完成它们的任务
现在我想切换到下一个或上一个图像,但我无法再访问下面函数中所需的currentSlide
变量
function navigateSlideshowLightbox (event, currentSlide) {
if (previousImgIconClicked) {
currentSlide = (currentSlide - 1 + allSlides) % allSlides
showCurrentSlide(currentSlide)
} else if (nextImgIconClicked) {
currentSlide = (currentSlide + 1) % allSlides
showCurrentSlide(currentSlide)
}
}
我试图在showCurrentSlide()
中使用return
语句:
然后在导航滑动显示灯箱()
中:
但是当前幻灯片
是未定义的
(这实际上应该是一个评论,但没有足够的空间来回答问题)
语句currentSlide=showCurrentSlide()
可能没有任何作用,因为showCurrentSlide()
没有返回值。返回值:
函数showCurrentSlide(currentSlide){
用于(连续幻灯片){
if(slide.classList.contains('slide_visible')){
slide.classList.remove('slide\u visible')
slide.classList.add('slide\u hidden')
}否则{
slide.classList.add('slide\u hidden')
}
}
幻灯片[currentSlide].classList.remove('slide_hidden')
幻灯片[currentSlide].classList.add('slide\u visible')
返回电流;
}
您的函数NavigatesSlideShowLightBox()
也应该返回currentSlide
,因为它正在修改它,对吗?您的书面描述说您试图使用return,但它不起作用-按您的方式发布代码,而不是按您希望的方式发布代码 另一个好奇:
showCurrentSlide(currentSlide=currentThumbnailImg)
我宁愿写两行
currentSlide=currentThumbnailImg;
showCurrentSlide(当前幻灯片);
在当前代码中,您不需要结果,那么为什么不直接提供该值呢
showCurrentSlide(currentThumbnailImg);
(这实际上应该是一个注释,但是没有足够的空间来回答问题)
语句currentSlide=showCurrentSlide()
可能没有任何作用,因为showCurrentSlide()
没有返回值。返回值:
函数showCurrentSlide(currentSlide){
用于(连续幻灯片){
if(slide.classList.contains('slide_visible')){
slide.classList.remove('slide\u visible')
slide.classList.add('slide\u hidden')
}否则{
slide.classList.add('slide\u hidden')
}
}
幻灯片[currentSlide].classList.remove('slide_hidden')
幻灯片[currentSlide].classList.add('slide\u visible')
返回电流;
}
您的函数NavigatesSlideShowLightBox()
也应该返回currentSlide
,因为它正在修改它,对吗?您的书面描述说您试图使用return,但它不起作用-按您的方式发布代码,而不是按您希望的方式发布代码 另一个好奇:
showCurrentSlide(currentSlide=currentThumbnailImg)
我宁愿写两行
currentSlide=currentThumbnailImg;
showCurrentSlide(当前幻灯片);
在当前代码中,您不需要结果,那么为什么不直接提供该值呢
showCurrentSlide(currentThumbnailImg);
currentSlide=showCurrentSlide()
如果不将参数传递给showCurrentSlide()
函数,即使添加return
语句,也将始终返回未定义的。您需要在此处传递一个参数,例如currentSlide=showCurrentSlide(theSlide)
。或者,您也可以将以下操作作为快速简单的解决方案
在以下函数中,由于您已经在使用slides
对象,因此只需将当前幻灯片添加到末尾的slides
对象中,以备以后使用:
function showCurrentSlide (currentSlide) {
for (const slide of slides) {
if (slide.classList.contains('slide_visible')) {
slide.classList.remove('slide_visible')
slide.classList.add('slide_hidden')
} else {
slide.classList.add('slide_hidden')
}
}
slides[currentSlide].classList.remove('slide_hidden')
slides[currentSlide].classList.add('slide_visible')
slides.lastActiveSlide = currentSlide // Adding it here
}
然后,当您运行navigateSlideshowLightbox()
函数时,您只需访问该对象属性,而不必依赖参数
function navigateSlideshowLightbox (event) {
if (previousImgIconClicked) {
const currentSlide = (slides.lastActiveSlide - 1 + allSlides) % allSlides
showCurrentSlide(currentSlide)
} else if (nextImgIconClicked) {
const currentSlide = (slides.lastActiveSlide + 1) % allSlides
showCurrentSlide(currentSlide)
}
}
currentSlide=showCurrentSlide()
如果未将参数传递给showCurrentSlide()
函数,即使添加了return
语句,也将始终返回undefined
。您需要在此处传递一个参数,例如currentSlide=showCurrentSlide(theSlide)
。或者,您也可以将以下操作作为快速简单的解决方案
在以下函数中,由于您已经在使用slides
对象,因此只需将当前幻灯片添加到末尾的slides
对象中,以备以后使用:
function showCurrentSlide (currentSlide) {
for (const slide of slides) {
if (slide.classList.contains('slide_visible')) {
slide.classList.remove('slide_visible')
slide.classList.add('slide_hidden')
} else {
slide.classList.add('slide_hidden')
}
}
slides[currentSlide].classList.remove('slide_hidden')
slides[currentSlide].classList.add('slide_visible')
slides.lastActiveSlide = currentSlide // Adding it here
}
然后,当您运行navigateSlideshowLightbox()
函数时,您只需访问该对象属性,而不必依赖参数
function navigateSlideshowLightbox (event) {
if (previousImgIconClicked) {
const currentSlide = (slides.lastActiveSlide - 1 + allSlides) % allSlides
showCurrentSlide(currentSlide)
} else if (nextImgIconClicked) {
const currentSlide = (slides.lastActiveSlide + 1) % allSlides
showCurrentSlide(currentSlide)
}
}
实际上不需要使用参数。当navigateSlideshowLightbox()
执行与openSlideshowLightbox()
不同的任务时,我迭代了navigateSlideshowLightbox()
中的所有幻灯片,通过检查当前看到的幻灯片,我获得了幻灯片所需的索引位置,然后将其分配给currentSlide
变量
function navigateSlideshowLightbox () {
if (previousImgIconClicked) {
for (const [slideVisible] of slides.entries()) {
if (slides[slideVisible].classList.contains('slide_visible')) {
currentSlide = (slideVisible - 1 + allSlides) % allSlides
}
}
showCurrentSlide(currentSlide)
} else if (nextImgIconClicked) {
// Here comes the same 'for' loop with if statement as above.
currentSlide = (slideVisible + 1) % allSlides
showCurrentSlide(currentSlide)
}
实际上不需要使用参数。当navigateSlideshowLightbox()
执行与openSlideshowLightbox()
不同的任务时,我迭代了navigateSlideshowLightbox()
中的所有幻灯片,通过检查当前看到的幻灯片,我获得了幻灯片所需的索引位置,然后将其分配给currentSlide
varia