事件处理程序使用函数式编程也许是最直观的函数作为值得应用。我知道function可以作为参数传递
Code
<div id="aaa">
<script language="javascript" type="text/javascript">
function Button(clickFunction) {
this.button = document.createElement("button");
this.button.appendChild(document.createTextNode("Press aaa!"));
this.button.onclick = clickFunction;
}
var bt = new Button(function() { alert("函数作为参数"); });
document.getElementById("aaa").appendChild(bt.button);
</script>
</div>
<div id="aaa">
<script language="javascript" type="text/javascript">
function Button(clickFunction) {
this.button = document.createElement("button");
this.button.appendChild(document.createTextNode("Press aaa!"));
this.button.onclick = clickFunction;
}
var bt = new Button(function() { alert("函数作为参数"); });
document.getElementById("aaa").appendChild(bt.button);
</script>
</div>
这个例子看的懂!但下面的列子就有点看不懂了
Code
<div id="bbb">
<script language="javascript" type="text/javascript">
function Button(value) {
this.value=value;
this.button=document.createElement("button");
this.button.appendChild(document.createTextNode("Press bbb!"));
//this.button.οnclick=function(){alert(this.value);}//如果你执行它你就会发现提示框中间是空的。为什么会这样呢?其实 原因在于JavaScript的可见性规则。当onclick函数被执行时this指 向的是按钮的DOM节点而非自定义的按钮对象。
this.button.onclick=(function(v){
return function(){alert(v);};
})(this.value);
}
var bt = new Button("函数式编程");
document.getElementById("bbb").appendChild(bt.button);
</script>
</div>
<div id="bbb">
<script language="javascript" type="text/javascript">
function Button(value) {
this.value=value;
this.button=document.createElement("button");
this.button.appendChild(document.createTextNode("Press bbb!"));
//this.button.οnclick=function(){alert(this.value);}//如果你执行它你就会发现提示框中间是空的。为什么会这样呢?其实 原因在于JavaScript的可见性规则。当onclick函数被执行时this指 向的是按钮的DOM节点而非自定义的按钮对象。
this.button.onclick=(function(v){
return function(){alert(v);};
})(this.value);
}
var bt = new Button("函数式编程");
document.getElementById("bbb").appendChild(bt.button);
</script>
</div>
特别是这一段怎么理解啊?!? 哪位大侠解释下
this.button.οnclick=(function(v){
return function(){alert(v);};
})(this.value);