可能是闭包中的一个小问题????

为什么下面 console.log(mytarget) 输出的不是200?

     
     <div class="box1" id="box1">
        <span class="share">justshare</span>
     </div>
     
     window.onload = function(){
        var box1 = document.getElementById('box1');
        box1.onmouseover = go(200);
    }

     function go(mytarget){
        
        return function(mytarget){
        console.log(mytarget); //输出的却是  mouseover clientX=43, clientY=100
    }
}
阅读 2.6k
3 个回答

return 的 function 别带参

  1. return的function不需要mytarget这个参数,因为mytarget在上层作用域已经存在了,闭包返回的函数能直接访问,也就是自由变量。

  2. 因为你在return的function上加上了参数,又把这个function赋值给了事件函数,所以会把事件默认的参数带到函数中,这个参数便是你加的mytarget。

  3. 因为mytarget在更加里层的作用域中被覆盖了,所以console.log输出的便是事件带来的参数而不是200。

如果你既想带"200"这个参数,又想得到事件参数。把return的function的参数改一个名即可。

你return的那个function不是你在调用,是浏览器的JS在调用,第一个参数是浏览器在事件处理时传给你的,就是我们通常所说的event对象。你就算改成aaa,bbb,这是只是形参的名字而已,实参并没有变化。

修改的方法上面的hsfzxjy朋友已经说了

    function go(){ // 这里去掉mytarget,防止重新赋值造成影响
        return function(mytarget){
            console.log(mytarget);clientY=100
        }
    }
    
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题