2013-02-27 39 views
0

所以我有一個大的JS文件,我從之前的開發人員繼承而來,我試圖讓我的頭部圍繞一些主要部分。這裏是整個代碼:進一步理解javascript init函數的設置

$(function() { 

    var homepage = (function() { 

     var startNewsTicker = function() { 

      var news = $('#newsSlider div'), 
       idx = 0, 
       isHovered = false, 
       TIMEOUT = 6000; 

      news.mouseenter(function() { 
       isHovered = true; 
      }); 

      news.mouseleave(function() { 
       isHovered = false; 
      }); 

      setInterval(function() { 
       if (!isHovered) { 
        news.eq(idx).fadeOut(500); 
        idx = (idx + 1 <= news.length - 1) ? idx + 1 : 0; 
        news.eq(idx).fadeIn(500); 
       } 
      }, TIMEOUT); 
      news.eq(idx).fadeIn(500); 
     }; 

     var slides = { 
       wrapper: $('#slideWrapper'), 
       slide: $('#slideWrapper li'), 
       imageWrapper: {}, 
       image: {}, 
       paginatorWrapper: {}, 
       paginator: {}, 
       prev: -1, 
       next: -1, 
       arrows: { 
        left: $('#arwLeft'), 
        right: $('#arwRight') 
       } 
      }, 
      centerSlideWrapper = function() { 
       slides.wrapper.css({ 
        marginTop: ((window.innerHeight - slides.wrapper.height())/2) + 'px', 
        opacity: 1 
       }); 
      }, 
      buildSlider = function() { 
       slides.prev = slides.length - 1; 
       slides.next = 1; 
       slides.wrapper.before('<div id="homepageBackgroundImages" />').after('<div id="homepagePagination" />'); 
       slides.imageWrapper = $('#homepageBackgroundImages'); 
       slides.paginatorWrapper = $('#homepagePagination'); 
       slides.paginatorWrapper.css('width', 36 * slides.slide.length + 'px') 
       slides.slide.each(function() { 
        var $t = $(this); 
        slides.imageWrapper.append('<div><img src="' + $t.attr('data-img') + '" /></div>'); 
        slides.paginatorWrapper.append('<a href="#"><span>' + $t.attr('data-tagline') + '</span></a>'); 
       }); 
       slides.image = slides.imageWrapper.find('div'); 
       slides.image.find('img').fullscreenBackground(); 
       slides.paginator = slides.paginatorWrapper.find('a'); 
       slides.imageWrapper.prepend('<div class="mask"></div>'); 

       //create offset margin left to auto center spans 
       slides.paginator.find('span').each(function() { 
        var $t = $(this); 
        $t.css({ 
         top: "-9999px", 
         display: "block" 
        }); 
        $t.css({ 
         marginLeft: -(($t.width() + parseFloat($t.css('paddingLeft')) + parseFloat($t.css('paddingRight')))/2) + 2 + 'px', 
         display: "none", 
         top: "-56px" 
        }) 
       }); 

      }, 
      startSlider = function() { 
       var slideIdx = -1, 
        currentSlide, 
        isHovered = false, 
        interval = { 
         delay: 8000, 
         timer: {}, 
         start: function() { 
          interval.timer = setInterval(function() { 
           if(!isHovered) 
            switchSlide(slideIdx + 1); 
          }, interval.delay); 
         }, 
         stop: function() { 
          clearInterval(interval.timer); 
         } 
        }, 
        switchSlide = function (idx) { 
         if (slideIdx > -1) { 
          slides.image.eq(slideIdx).stop(true, true).fadeOut(500); 
          slides.slide.eq(slideIdx).stop(true, true).fadeOut(500); 

         } 
         idx = (idx <= slides.slide.length - 1) ? idx : 0; 
         slides.image.eq(idx).stop(true, true).fadeIn(500); 
         slides.slide.eq(idx).stop(true, true).fadeIn(500); 
         slideIdx = idx; 
         slides.paginator.removeClass('current').eq(idx).addClass('current'); 
         slides.prev = (slideIdx - 1 >= 0) ? slideIdx - 1 : slides.slide.length-1; 
         slides.next = (slideIdx + 1 <= slides.slide.length - 1) ? slideIdx + 1 : 0; 
         slides.arrows.left.find('span').text(slides.slide.eq(slides.prev).attr('data-tagline')); 
         slides.arrows.right.find('span').text(slides.slide.eq(slides.next).attr('data-tagline')); 
        } 

       slides.paginator.click(function (e) { 
        e.preventDefault(); 
        interval.stop(); 
        switchSlide($(this).index()); 
        interval.start(); 
       }); 

       slides.arrows.left.click(function (e) { 
        e.preventDefault(); 
        interval.stop(); 
        switchSlide(slides.prev); 
        interval.start(); 
       }); 

       slides.arrows.right.click(function (e) { 
        e.preventDefault(); 
        interval.stop(); 
        switchSlide(slides.next); 
        interval.start(); 
       }); 

       slides.arrows.left.mouseenter(function (e) { 
        e.preventDefault(); 
        isHovered = true; 
       }); 
       slides.arrows.right.mouseenter(function (e) { 
        e.preventDefault(); 
        isHovered = true; 
       }); 

       slides.arrows.left.mouseleave(function (e) { 
        e.preventDefault(); 
        isHovered = false; 
       }); 

       slides.arrows.right.mouseleave(function (e) { 
        e.preventDefault(); 
        isHovered = false; 
       }); 

       slides.slide.find('strong').mouseenter(function() { 
        isHovered = true; 
       }); 

       slides.slide.find('strong').mouseleave(function() { 
        isHovered = false; 
       }); 

       switchSlide(0); 
       interval.start(); 
      } 

     return { 
      init: function() { 
       centerSlideWrapper(); 
       $(window).resize(function() { 
        centerSlideWrapper(); 
       }); 
       buildSlider(); 
       startSlider(); 
       startNewsTicker(); 
      } 
     } 

    })(); 
    homepage.init(); 
}); 

在這種情況下,我試圖找出是什麼,是打算跟大塊:

var homepage = (function() { 

... 

    return { 
     init: function() { 
      centerSlideWrapper(); 
      $(window).resize(function() { 
       centerSlideWrapper(); 
      }); 
      buildSlider(); 
      startSlider(); 
      startNewsTicker(); 
     } 
    } 
})(); 
homepage.init(); 

我感到困惑的是:

1)爲什麼用這種方式創建這個homepage函數會有好處。

2)此外,我不明白的是函數如何返回一個包含另一個JS函數init,然後通過使用homepage.init();運行的對象。這個homepage.init();調用是否調用homepageinit函數來運行?

感謝您的幫助!

回答

2

1)爲什麼要以這種方式創建這個主頁功能將是有益的。

它通常被稱爲「泄露模塊模式」,通常用於創建只能使用「公共」屬性/方法(封裝)進行訪問私有靜態成員。

有關這種模式的更多信息,請參閱:Why embed the JavaScript class in an anonymous function() call?

或者:谷歌/冰/雅虎「揭開模塊模式」

2)此外,啥子我不明白的是這個函數是如何返回一個包含另一個JS函數init並隨後使用homepage.init();來運行的對象。這個homepage.init();調用調用主頁和init函數來運行?

是,它調用homepage對象引用init方法。

+1

非常豐富!感謝您的信息!我一定會研究這個揭示模塊模式。 – 2013-02-28 01:07:29

2

在JavaScript中,類是通過函數創建的。所以這段代碼創建一個匿名函數並調用它,立即將其值返回給主頁。返回主頁的是具有一個屬性的函數/對象 - 在本例中爲init函數。

然後使用對象homepage訪問init函數。

爲什麼這樣呢?它在全球範圍內隱藏了您在示例中所有的東西...。但當homepage.init()被調用時,它們仍然可以被init函數訪問。爲什麼?因爲它們與init函數處於相同的範圍(在這種情況下是一個更高的範圍)。所以你可以調用homepage.int();,但你不能打電話homepage.startSlider()爲例。

+0

非常感謝您的信息!你描述這些信息的敘述方式非常有幫助! – 2013-02-28 01:08:07