startMove(this,100); 为什么这里的this 不能用 oDiv[i]替代????

来源:4-1 JS多物体动画

rainy_li3676598

2016-11-12 20:29

window.onload=function (){

   var oDiv=document.getElementsByTagName('div');

   for(i=0;i<oDiv.length;i++){

   oDiv[i].timer=null;

   oDiv[i].alpha=30;

   oDiv[i].onmouseover=function () {startMove(this,100);}  //为什么这里的this 不能用 oDiv[i]替代????

   oDiv[i].onmouseout=function(){startMove(this,30);}

}

}


function startMove(obj,iTarget) {

var speed=obj.alpha>iTarget?speed=-5:speed=5;

   clearInterval(obj.timer);

   obj.timer=setInterval( function(){

    if (obj.alpha==iTarget) {  clearInterval(obj.timer);} 

    else {obj.alpha+=speed;obj.style.opacity=obj.alpha/100;}

   },30) 

按我的理解, 这里的this其实本质就是oDiv[i]

如果改了了oDiv[i]以后, 报错提示obj.alpha 错误, 为什么?

写回答 关注

2回答

  • 冷月诗魂
    2016-11-14 17:24:05

    函数是先定义再执行的,比如你写的

     oDiv[i].onmouseover=function () {startMove(this,100);}  //为什么这里的this 不能用 oDiv[i]替代????

    这段代码在被解析的时候是这样的 oDiv[i].onmouseover=function () {},

    里面的代码还不会被执行,当所有函数被定义完之后在执行里面的代码,而这个时候oDiv[i]已经被释放掉了,不存在了,你再写oDiv[i]自然就会报错 。

    这只是this的其中一种用法,还有很多,基本用法就是this指向当前调用函数的那个对象,这里的对象就是oDiv[i],其他还有很多方法就不说了,你可以自己搜下

    冷月诗魂 回复rainy_...

    onload里面的。 其实写oDiv[i]也行的,但i的值循环完后就被加了1,所以不存在,你写oDiv[i-1] ( 1 你可以改成2,3...你就知道了 )

    2016-11-15 13:08:31

    共 3 条回复 >

  • 天之殇
    2016-11-12 21:37:50

    个人感觉此处的this应该是指针的效果,指向的就是鼠标滑过的div,

    window.onload = function(){
       var aLi = document.getElementsByTagName("li");---------aLi[i]的生命周期只在这个大花括号中
       for(var i=0;i<aLi.length;i++){
           aLi[i].timer = null;
           aLi[i].alpha = 0;
           aLi[i].onmouseover = myMouseOver;
       }
    }
    function myMouseOver(){
       startMove(this,100,'opacity');--------此处如果是aLi[i]那么对于这个方法来说就没有这个变量存在
    }

    以上是自己试验的结果,不知道对不对,如果不对告诉我下

    rainy_...

    应该不是你这样的,因为在onload里面开始已经申明了aLi,然后startMove是在里面,是可以调用的,函数申明是可以给子函数用的

    2016-11-12 22:35:49

    共 1 条回复 >

JS动画效果

通过本课程JS动画的学习,从简单动画开始,逐步深入各种动画框架封装

113923 学习 · 1443 问题

查看课程

相似问题