那个:这个js是什么意思?我正在研究SO源代码

时间:2010-10-25 12:45:30

标签: javascript

(某些代码)(jQuery);

这是什么意思?

(function (a) {
    function d(g) {
        return typeof g == "object" ? g : {
            top: g,
            left: g
        }
    }
    var b = a.scrollTo = function (g, e, f) {
        a(window).scrollTo(g, e, f)
    };
    b.defaults = {
        axis: "xy",
        duration: parseFloat(a.fn.jquery) >= 1.3 ? 0 : 1
    };
    b.window = function () {
        return a(window)._scrollable()
    };
    a.fn._scrollable = function () {
        return this.map(function () {
            if (!(!this.nodeName || a.inArray(this.nodeName.toLowerCase(), ["iframe", "#document", "html", "body"]) != -1)) return this;
            var g = (this.contentWindow || this).document || this.ownerDocument || this;
            return a.browser.safari || g.compatMode == "BackCompat" ? g.body : g.documentElement
        })
    };
    a.fn.scrollTo = function (g, e, f) {
        if (typeof e == "object") {
            f = e;
            e = 0
        }
        if (typeof f == "function") f = {
            onAfter: f
        };
        if (g == "max") g = 9E9;
        f = a.extend({}, b.defaults, f);
        e = e || f.speed || f.duration;
        f.queue = f.queue && f.axis.length > 1;
        if (f.queue) e /= 2;
        f.offset = d(f.offset);
        f.over = d(f.over);
        return this._scrollable().each(function () {
            function k(w) {
                j.animate(r, e, f.easing, w &&
                function () {
                    w.call(this, g, f)
                })
            }
            var h = this,
                j = a(h),
                i = g,
                m, r = {},
                u = j.is("html,body");
            switch (typeof i) {
            case "number":
            case "string":
                if (/^([+-]=)?\d+(\.\d+)?(px|%)?$/.test(i)) {
                    i =
                    d(i);
                    break
                }
                i = a(i, this);
            case "object":
                if (i.is || i.style) m = (i = a(i)).offset()
            }
            a.each(f.axis.split(""), function (w, v) {
                var q = v == "x" ? "Left" : "Top",
                    s = q.toLowerCase(),
                    y = "scroll" + q,
                    D = h[y],
                    H = b.max(h, v);
                if (m) {
                    r[y] = m[s] + (u ? 0 : D - j.offset()[s]);
                    if (f.margin) {
                        r[y] -= parseInt(i.css("margin" + q)) || 0;
                        r[y] -= parseInt(i.css("border" + q + "Width")) || 0
                    }
                    r[y] += f.offset[s] || 0;
                    if (f.over[s]) r[y] += i[v == "x" ? "width" : "height"]() * f.over[s]
                } else {
                    q = i[s];
                    r[y] = q.slice && q.slice(-1) == "%" ? parseFloat(q) / 100 * H : q
                }
                if (/^\d+$/.test(r[y])) r[y] = r[y] <= 0 ? 0 : Math.min(r[y], H);
                if (!w && f.queue) {
                    D != r[y] && k(f.onAfterFirst);
                    delete r[y]
                }
            });
            k(f.onAfter)
        }).end()
    };
    b.max = function (g, e) {
        var f = e == "x" ? "Width" : "Height",
            k = "scroll" + f;
        if (!a(g).is("html,body")) return g[k] - a(g)[f.toLowerCase()]();
        f = "client" + f;
        var h = g.ownerDocument.documentElement,
            j = g.ownerDocument.body;
        return Math.max(h[k], j[k]) - Math.min(h[f], j[f])
    }
})(jQuery);

1 个答案:

答案 0 :(得分:2)

这是一个关闭。

代码的一部分可以拥有自己的变量,而这些变量不会与代码的其余部分共享。

最后的括号将参数传递给此闭包。

像这样:

(function (what, howmany){
    for (var i = howmany; i--;){
        alert(what);
    }
})("John",3);

在您的示例中,闭包正在使用jquery对象作为参数进行调用。

通过这个,您可以隔离代码的这一部分的执行。它功能强大,必须熟悉编写真正的javascript。

要在javascript中查看有关闭包的更多信息,请参阅:http://jibbering.com/faq/notes/closures/