1

我正在查看此http://raphaeljs.com/australia.html示例的源代码,并尝试解释为使用 RaphaelJS 图形库创建类似项目所做的工作。

但是,我对部分代码感到困惑。具体来说,作者在 for 循环内的函数中使用了一个参数“st”,之前没有定义,而第二个参数“state”有。我不确定我错过了什么,但有人可以解释一下这里发生了什么吗?这是通用参数还是对特定内容的调用?

for (var state in aus) {
            aus[state].color = Raphael.getColor();
            (function (st, state) {
                st[0].style.cursor = "pointer";
                st[0].onmouseover = function () {
                    current && aus[current].animate({fill: "#333", stroke: "#666"}, 500) && (document.getElementById(current).style.display = "");
                    st.animate({fill: st.color, stroke: "#ccc"}, 500);
                    st.toFront();
                    R.safari();
                    document.getElementById(state).style.display = "block";
                    current = state;
                };
                st[0].onmouseout = function () {
                    st.animate({fill: "#333", stroke: "#666"}, 500);
                    st.toFront();
                    R.safari();
                };
                if (state == "nsw") {
                    st[0].onmouseover();
                }
            })(aus[state], state);
        }
4

2 回答 2

1

st是周围闭包的命名参数:

(function (st, state) {
    // ...
})(aus[state], state);

这称为立即调用函数表达式(通常称为自执行块临时范围),用于通过从周围上下文中提取代码来“保存”状态。

为了从闭包外部引入变量,可以将它们作为参数传递给尾括号(这里aus[state], state),并在函数的签名中命名它们(这里st, state)。

参考

延伸阅读

于 2013-01-27T10:29:38.997 回答
0

使用值aus[state]和调用该函数state(查看倒数第二行)。所以它相当于:

for (var state in aus) {
        aus[state].color = Raphael.getColor();

        var st = aus[state]; // This line replaces the function

        st[0].style.cursor = "pointer";
        st[0].onmouseover = function () {
            current && aus[current].animate({fill: "#333", stroke: "#666"}, 500) && (document.getElementById(current).style.display = "");
            st.animate({fill: st.color, stroke: "#ccc"}, 500);
            st.toFront();
            R.safari();
            document.getElementById(state).style.display = "block";
            current = state;
        };

        st[0].onmouseout = function () {
            st.animate({fill: "#333", stroke: "#666"}, 500);
            st.toFront();
            R.safari();
        };

        if (state == "nsw") {
            st[0].onmouseover();
        }
    }
于 2013-01-26T17:33:20.683 回答