之前我的文章提到调用外部闭包的函数,并不会触发里面的匿名的函数.只会返回函数体.但是一位热心的读者说不是这样,他说下面这段代码就是调用外部函数也直接运行了匿名函数.
<script type="text/javascript">
function move(speed){
return function(){
box.style.left = box.offsetLeft + speed + "px";
}
}
btn1.onclick = move(-20);
btn2.onclick = move(20);
</script>
这个时候不仅调用了外层的函数,同时也运行了里面的函数.但是,有一个特殊的地方就是,加了一个onclick绑定事件. 让我们看一看没有onclick绑定时候的情况.
function move(speed){
return function(){
box.style.left = box.offsetLeft + speed + "px";
console.log("I am function")
}
}
move(200);
-
这个时候,普通的调用的时候 却没有触发function.也没有输出 "I am function".点击也没有任何效果
-
所以在普通情况下, 闭包中匿名的函数没有被调用. 但是涉及到类似onclick的绑定事件.就直接调用了.我认为原因如下
window.onload=function () { var a=document.getElementById("a") function c(){ alert(1); } function b(){ alert(2); } a.onclick=c();b(); }
onClick可以同时绑定两个函数,甚至两个以上. 所以在上面那段代码事件可能是这样
btn1.onclick = move(-20);function(){ box.offsetLeft+speed+"px"}
- 实际调用了move()和全局的匿名的函数.