見注釋里的提問,問題還是給某個事件調用函數加不加括號的問題;
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>practice</title>
<style type="text/css">
*{margin:0px;padding:0px;}
#div1 {position:relative;left:-200px;width:200px;height:200px;margin-top:50px;background-color: pink;}
#share{background-color:lightblue;width:20px;height:50px;position: absolute;left:200px;top:75px;}
</style>
<script type="text/javascript">
window.onload=function(){
var div1=document.getElementById("div1");
/*div1.onmouseover=startMove; */ /*不加括號,就是正常的,鼠標放上,開始移動;*/
div1.onmouseover=startMove(); /*為什么加了括號之后,一打開就開始移動,鼠標不放上去也是移動的;*/
};
var timer=null;
function startMove(){
var div1=document.getElementById("div1");
timer=setInterval(
function(){
if(div1.offsetLeft==0){clearInterval(timer)}
else {div1.style.left=div1.offsetLeft+10+'px'}}
? ,30);
}
</script>
</head>
<body>
<div id="div1">
<span id="share">分享</span>
</div>
</body>
</html>
2016-11-20
首先弄清楚startMove; 和startMove();區別,第一個是函數本身,第二個是函數執行的結果。
假設a = b + c,那此公式會先計算b+c再賦值給a。
我們看div1.onmouseover=startMove();,先計算startMove(),那么此時已經運行了startMove函數并執行了函數,所以一打開就會看到物體移動的現象。而我們看div1.onmouseover=startMove;是將函數代碼本身賦值給前面,當鼠標經過的時候,div1.onmouseover會變成如下所示:
如同,div1.onmouseover = function(){ alert("aaa");},成功執行函數。
2016-11-16
div1.onmouseover=startMove; /*不加括號,就是正常的,鼠標滑過,開始移動,表示鼠標滑過,調用這個函數*/
div1.onmouseover=startMove();
/*加了括號之后,一打開就開始移動,表示,把函數執行的結果給div1的鼠標滑過事件,所以會去先執行函數,因為函數執行的結果就是offsetLeft==0,然后把這個結果給div1的鼠標滑過事件,所以會出現一打開就跑,這是為了得到函數執行的結果*/
這樣解釋對不對?
2016-11-16
函數名加括號表示調用并執行該函數,你alert一下有括號和沒括號,alert(startMove),,,alert(startMove())
2016-11-16
函數名加括號表示調用并執行該函數,你alert一下有括號和沒括號,alert(startMove),,,alert(startMove())