2016-03-05 64 views
2

我最近看到一個監聽器在對象的方法裏面定義了什麼都沒有。很好的例子是這樣的在對象內部定義的事件監聽器

var obj={ 
    shout:function(){ 
     onclick = function(){ 
      alert("hi"); 
     } 
    } 
} 
obj.shout() 

這個工程就像window.onclick = shout;

也當我們重新定義這樣

var obj={ 
    shout:function(s){ 
     onclick = function(s){ 
      alert(s); 
     } 
    } 
} 
obj.shout('hi') 

它輸出[對象鼠標事件]功能

它是怎樣到達全自動綁定到窗口對象?這應該指向obj對象,如果onclick被綁定到this呼籲這是指obj(我的懷疑)它是如何與窗口對象一起工作?

+1

您可能認爲全局變量(這裏是「obj」和「onclick」)實際上是全局「窗口」對象(在瀏覽器中)的屬性。也就是說,'var obj = foo;'實際上是'window [obj] = foo;'aka'window.obj = foo;' –

+0

Err。 'window [「obj」] = foo;'就是。 (編輯以前的評論太遲了)。 –

回答

3

它是怎樣到達全自動綁定到窗口對象?

因爲onclickwindow的屬性,以及window所有屬性都是全局變量。由於您尚未在任何地方聲明onclick變量,因此onclick = function...行將分配給全局。

3

它是如何自動綁定到窗口對象的?

因爲每當您聲明變量而不使用var關鍵字,它將被分配到window object。因此,在我們的情況下,您已指定functiononclick,而未指定var,因此該功能被分配爲window.onclick

,如果你想使用通過constructor函數傳遞的值,那麼對於你需要寫一個closure

var obj={ 
    shout:function(s){ 
     onclick = function(){ 
     //-----------------^ remove the parameter here, and it will become a closure. 
      alert(s); 
     } 
    } 
} 

obj.shout('hi'); 
+0

*「因爲每當你聲明一個變量而不使用'var'關鍵字時」*他們根本不*聲明* onclick變量。他們*使用*它。 –

+0

@ T.J.Crowder是的,這條線是一條通用語句。但是後來我已經明確地解釋了'onclick'。我接受,我沒有完全讀過這個問題。收到downvote後完全閱讀。感謝您的發言。 :) –