0 0

javascript函数返回的一个奇怪的现象5

HTML代码:
<!Doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>2.2.1</title>
<style type="text/css">
h2{ text-align: center; color: #666; text-shadow: 2px 2px 2px #eee; margin: 10px;}
body{ margin:0px; padding:0px; background-color: #DDD;}
#canvas{ width: 600px; height: 600px; position:relative; margin:0px auto; padding:10px; background-color: #999; border: 10px solid #F40; box-shadow: 1px 1px 10px #f60; }
</style>
<script type="text/javascript" src="js/util.js"></script>
<script type="text/javascript">
window.onload=function(){
   var can=document.getElementById('canvas');
   var mouse1=captureMouse(can);
   can.onmousedown=function(){
        console.log("x:"+mouse1.x);
   }
}
</script>
</head>

<body>
<h2>canvas动画</h2>
<div id="canvas">
<canvas width="600" height="600"><i>您的浏览器版本太低,请升级至最新版本</i></canvas>
</div>
</body>
</html>

下面是utils.js代码:
var captureMouse=function(ele){
    var mouse={x:0,y:0};
    ele.onmousemove=function(event){
        event=event || window.event;
        if(event.pageX || wvwnt.pageY){
            x=event.pageX;
            y=event.pageY;
        }else{
            x=event.clientX+document.body.scrollLeft+document.documentElement.scrollLeft;
            y=event.clientY+document.body.scrollTop+document.documentElement.scrollTop;
        }
        x-=ele.offsetLeft;
        y-=ele.offsetTop;
        mouse.x=x;
        mouse.y=y;
    };
    return mouse;
}

问题出现在captureMouse这个函数的返回值上面(captureMouse函数是一个求鼠标相对当前元素坐标的求法函数)。
captureMouse在html页面onload后会执行一次,然后为ele元素绑定了鼠标移动事件,同时会将当前鼠标相对于ele元素的坐标返回,html页面接受变量为mouse1。
但是大家想一下,接下来的鼠标移动只是响应了鼠标移动的事件,但是html页面并没有在鼠标移动的同时调用captureMouse,所以mouse1这个对象应该是一个不变的值,但是当我点击ele元素时发现坐标是变的,这是为什么呢?鼠标按下输入控制台的是mouse1对象的x的值,求大神指点迷津。

问题补充:请注意,mouse1的值只有在onload时赋予了值,之后的鼠标移动事件没有对mouse1的值做出改变,但为什么点击ele显示的mouse1的值是在变化着的?
2013年8月14日 15:43
  • 大小: 56.3 KB

2个答案 按时间排序 按投票排序

0 0

采纳的答案

ele.onmousemove=function(event){  
        event=event || window.event;
传入这个参数是canvas,你这行代码给它添加了监听鼠标滑过的监听,只要鼠标在canvas上移动,就会触发事件,上面的代码和下面的是等效的。

var captureMouse=function(ele){
    var mouse={x:0,y:0};
    ele.onmousemove=function(event){
        event=event || window.event;
        if(event.pageX || event.pageY){
            x=event.pageX;
            y=event.pageY;
        }else{
            x=event.clientX+document.body.scrollLeft+document.documentElement.scrollLeft;
            y=event.clientY+document.body.scrollTop+document.documentElement.scrollTop;
        }
        x-=ele.offsetLeft;
        y-=ele.offsetTop;
        mouse.x=x;
        mouse.y=y;
    };
	ele.onmousedown=function(){
        console.log("x:"+mouse.x);
   }
    return mouse;
}



window.onload=function(){
   var can=document.getElementById('canvas');
   var mouse1=captureMouse(can);
   
}

2013年8月14日 17:17
0 0

问题在 var captureMouse=function(ele){ 
    var mouse={x:0,y:0}; 
    ele.onmousemove=function(event){  ,
其中
ele.onmousemove=function(event)
这里已经给ele添加了function,当然会自动执行这个函数

2013年8月14日 16:27

相关推荐

    javascript函数式编程

    2. **高阶函数**:高阶函数是接受一个或多个函数作为参数,或者返回一个函数的函数。JavaScript中的Array.prototype方法如`map`、`filter`、`reduce`都是高阶函数的实例,它们用于处理数组而不会改变原数组。 3. **...

    JavaScript函数式编程.pdf

    闭包是指有权访问另一个函数作用域中变量的函数。由于JavaScript的作用域链,闭包能够访问到函数定义时的外部变量,即使外部函数已经执行结束。闭包通常用于创建私有变量和方法,以及数据封装。 4. 纯函数和副作用 ...

    javascript指南和函数式编程

    3. **柯里化(Currying)**:将接受多个参数的函数转化为接受一个参数并返回另一个函数的过程。 4. **函数组合(Function Composition)**:将多个函数串联起来,形成一个新的复合函数。 5. **函数式数据结构**:如...

    C#与JAVASCRIPT函数的相互调用 C#调用JAVASCRIPT函数的调用 JAVASCRIPT调用C#函数的调用

    C#与JAVASCRIPT函数的相互调用 C#调用JAVASCRIPT函数的调用 JAVASCRIPT调用C#函数的调用

    JavaScript函数(源代码)

    JavaScript函数(源代码)JavaScript函数(源代码)JavaScript函数(源代码)JavaScript函数(源代码)JavaScript函数(源代码)JavaScript函数(源代码)JavaScript函数(源代码)JavaScript函数(源代码)...

    javascript 函数教程(由浅入深)

    - 使用 `return` 语句从函数中返回一个值。不使用 `return` 的函数也可以被执行,但不会返回任何值。 - `return` 语句可以与 `confirm()` 方法结合,用于确认用户的操作,返回用户的选择结果。 5. **函数的使用...

    javascript函数速查

    如果省略了函数名,就创建了一个匿名函数,例如用在回调或立即调用的函数表达式(IIFE)。 二、函数参数 JavaScript函数可以接受任意数量的参数,即使在声明时未指定。例如: ```javascript function greet(name) {...

    JavaScript函数式编程pdf

    2. 高阶函数:高阶函数是接受一个或多个函数作为输入,或者返回一个函数作为输出的函数。在书中,作者可能讨论了map、reduce、filter等高阶函数的使用,它们常用于数组处理,提供了一种声明式的编程方式。 3. 纯...

    JavaScript函数式编程_PDF电子书下载 高清 带索引书签目录

    JavaScript函数式编程_PDF电子书下载 高清 带索引书签目录

    javascript常用判断函数

    这个函数的主要功能是计算字符串的长度,但与JavaScript原生的`length`属性不同,`DataLength`考虑了Unicode字符的情况。在JavaScript中,一个Unicode字符可能占用两个字节,而普通ASCII字符只占用一个字节。因此,...

    QT和网页中的JavaScript函数进行相互调用的实现

    - 这里的回调函数用于处理JavaScript函数的异步返回结果,如果需要同步获取结果,可以使用`QWebEngineScript`来注册一个全局JavaScript对象,然后通过该对象调用JavaScript函数。 2. **JavaScript调用QT函数**: ...

    JavaScript ES6函数式编程入门经典_javascript_

    8. **函数柯里化**:柯里化是将接受多个参数的函数转换为接受一个参数(通常是部分参数)的函数的过程,每次调用只处理一个参数,并返回一个新的函数等待处理下一个参数。这有助于提高代码复用性。 9. **Promise**...

    JavaScript实用小函数(一)

    2. **高阶函数**: 高阶函数可以接受一个或多个函数作为参数,或者返回一个函数。`Array.prototype.map()`、`filter()`和`reduce()`是常见的高阶函数示例,它们用于处理数组。 3. **闭包**: 闭包是指函数可以访问并...

    javascript实现根据函数名称字符串动态执行函数的方法示例

    在上述代码中,`test`函数接受一个函数名的字符串,使用eval()函数检查并执行该函数。如果函数存在,则执行并弹出警告框显示“11111”,否则显示“函数不存在”。 2. 使用window对象: 在浏览器环境中,所有的全局...

    JavaScript函数式编程

    全书分别介绍了JavaScript函数式编程、一等函数与Applicative编程、变量的作用域和闭包、高阶函数、由函数构建函数、递归、纯度和不变性以及更改政策、基于流的编程、类编程。除此之外,附录中还介绍了更多函数式...

    JavaScript实现函数返回多个值的方法

    调用这个函数时,我们得到一个数组,然后可以通过索引访问这个数组以获取具体的返回值。 ```javascript // 示例一:使用数组返回多个值 var mValues = function() { var a = "a"; var b = "b"; return [a, b]; /...

    javaScript函数式编程

    4.2 返回其他函数的函数67 4.2.1 高阶函数捕获参数69 4.2.2 捕获变量的好处69 4.2.3 防止不存在的函数:fnull72 4.3 整合:对象校验器74 4.4 总结77 第5章 由函数构建函数78 5.1 函数式组合的精华78 5.2 柯里化...

    JavaScript函数小集锦

    - `eval()`:执行一个字符串作为JavaScript代码,返回代码执行后的结果。 - `isNaN()`:检查给定的值是否不是数字,返回true或false。 - `parseFloat()`:将字符串转换为浮点数,忽略非数字字符。 - `parseInt()...

Global site tag (gtag.js) - Google Analytics