我正在查看此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);
}
答案 0 :(得分:1)
st
是周围闭包的命名参数:
(function (st, state) {
// ...
})(aus[state], state);
此被称为一个立即调用的函数表达式(通常称为自执行块或 临时范围)用来“保存“从周围环境中提取代码的状态。
为了从闭包外部引入变量,可以将它们作为参数传递给尾随括号(此处为aus[state], state
),并将它们命名为函数的签名(此处为st, state
)。
答案 1 :(得分: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();
}
}