2014-05-23 102 views
1

我想了解这段JavaScript代码:事件变量来自哪里?

onMouseMoved = (function(_this) { 
    return function(event) { 
     dx = (event.pageX/3)/window.innerWidth; 
     dy = (event.pageY/3)/window.innerHeight; 
     return tr = Math.atan2(hy, hx); 
    }; 
    })(this); 
    window.addEventListener('mousemove', onMouseMoved, false); 

为什么外部函数返回一个功能,哪里事件变量从何而来?

+0

变量是参数。或者你问价值从何而来? – Bergi

+0

这是咖啡脚本生成的代码,不是吗? IEFE的原因是编译器不是很聪明。 – Bergi

+0

是的,它是....... – Himmators

回答

1

为什么外部函数返回一个函数

因为:

(一)它有一个函数表达式的前return语句

( b)返回的函数用作函数的参数,该函数期望该参数是函数

哪里事件变量来自

从实现事件侦听器例程的本地浏览器的代码(根据the specificationaddEventListener

1

第一功能是一个紧调用的功能表达式(IIFE)立即执行并返回另一个设置为事件处理函数回调的函数。

它也可以写成这样

window.addEventListener('mousemove', onMouseMoved, false); 

function onMouseMoved(event) { 
    dx = (event.pageX/3)/window.innerWidth; 
    dy = (event.pageY/3)/window.innerHeight; 
    return tr = Math.atan2(hy, hx); 
}; 

或本

window.addEventListener('mousemove', function(event) { 
    dx = (event.pageX/3)/window.innerWidth; 
    dy = (event.pageY/3)/window.innerHeight; 
    return tr = Math.atan2(hy, hx); 
}, false); 

这将是完全一样的,但我们不会有_this的价值,这似乎是原因对于IIFE,锁定this的外部值,但该函数参数从不使用,因此在这里看起来并不需要。

因此事件的说法是从本地addEventListener

来进行彻底的解释,说明IIFE是如何工作的,看到这个
Why do you need to invoke an anonymous function on the same line?