关于init的jQuery问题

时间:2011-04-14 21:29:54

标签: jquery

我最近一直关注一些网站,看看他们如何构建他们的jQuery,看看Forrst.com,他们似乎有一种非常独特的使用方式。

以下是他们网站上的一些代码片段。

Forrst = {
    showingTopClicker: false,
    currentUserID: -1,
    formKey: "",
    init: function () {
        $(document).ready(function () {
            Forrst.formKey = $("meta[name=forrst-form-key]").attr("content");
            Forrst.currentUserID = $("meta[name=forrst-userid]").attr("content");
            Forrst.applyLibs();
            Stream.init();
            $("#promo-excerpt").jTruncate({
                length: 95
            });
            $(".notice-bar a.close").click(function () {
                return Forrst.hideNoticeBar()
            });
            PostForm.init();
            People.init();
            Comments.init();

Stream = {
    isLoading: false,
    streamPath: "",
    pageBy: "after",
    afterID: false,
    page: 1,
    extraParams: {},
    init: function () {
        if ($("#stream").length == 0) {
            return
        }
        Stream.redirectFromHash();
        $(".post-toggle > a").live("click", function () {
            $(this).parent().parent().children(".post").toggle("fast");
            $(this).parent().hide();
            return false
        });
        $(window).scroll(function () {
            if (($(document).height() - $(window).height()) - $(window).scrollTop() <= 300) {
                Stream.loadMore()
            }
        })
    },
    redirectFromHash: function () {
        if (window.location.hash != null && window.location.hash != "" && window.location.hash.match(/^#?after:/i)) {
            var b = window.location.pathname.split("/");
            var c = "";

Forrst.init();

有谁可以解释这里发生的事情以及以这种方式构建代码的优势是什么?感谢

2 个答案:

答案 0 :(得分:0)

猜测:Forrst用于母版页或某个模板,Stream用于派生视图并具有特定页面javascript。

答案 1 :(得分:0)

优点是,由于您的函数是沙箱(命名空间是一个更好的词),您可以使用规范函数名称,如init(因此调用如此:Forrst.init())而不是{{ 1}}。这允许函数名称更清楚地表明他们将要做什么。

此外,您不会混淆全局命名空间。为什么这是坏的一个例子:如果你命名一个全局函数Forrst_init,然后你试图添加一个名为init的全局函数的jQuery插件,你会遇到问题并且会有重写一些代码以摆脱函数冲突。使用命名空间,您可以调用initMyPlugin.init(),以避免此问题。