2014-05-23 107 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?