1

このhttp://raphaeljs.com/australia.htmlの例のソースコードを見て、RaphaelJSグラフィックライブラリを使用して同様のプロジェクトを作成するために行われたことを解釈しようとしています。

しかし、私はコードの一部について混乱しています。具体的には、作成者はforループ内の関数でパラメーター "st"を使用しますが、これは以前に定義されていませんが、2番目のパラメーター"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(最後から2番目の行を見てください)を使用して呼び出されます。したがって、次のようになります。

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 に答える