2015-05-25 26 views
1
$(function(){ 
    //choose one below at once, the results are different 
    $('#click').click(clickMe.popup); 
    $('#click').click(clickMe.popup()); 
}); 

var clickMe = { 
    message: 'hello', 
    popup: function(){ 
     alert(this.message); 
    } 
} 

<input type='button' value='click me' id='click' /> 

的結果是不同的,申報的功能在Javascript(或jQuery的)可變

  1. 當我選擇的第一個,我得到一個彈出點擊該按鈕時,卻顯示「未定義」 。

  2. 當我選擇第二個時,加載時會自動彈出一個彈出窗口,並且有「hello」消息。

問:

  1. 什麼是彈出()和彈出之間有什麼不同?
  2. 彈出窗口內的信息有什麼問題?
+0

其中一個顯示彈出是(函數)其他調用它,它返回未定義。 – artm

回答

8

popup()和popup有什麼不同?

popup()來電的功能。 popup只是指它(例如,因此您可以將其指定爲click處理程序)。

彈出窗口內的信息有什麼問題?

當你把它掛作爲

$('#click').click(clickMe.popup); 

...點擊會調用該函數,但this指的是DOM元素,而不是你clickMe對象。您可以使用Function#bind來解決這個問題:

$('#click').click(clickMe.popup.bind(clickMe)); 

Function#bind返回,調用它時,會調用原始與this價值,你提供的功能。如果您需要支持舊的瀏覽器(如IE8)不具有Function#bind,jQuery提供$.proxy,做同樣的事情:

$('#click').click($.proxy(clickMe.popup, clickMe)); 

...或者你可以只墊片/填充工具Function#bind(搜索會給你幾個實現)。

+0

另一個問題,爲什麼當我選擇第二個彈出窗口時彈出窗口會自動觸發?它應該只發生在我點擊按鈕時。 – enzoyaaaaa

+0

@angelyaaaaa:因爲如上所述,'popup()'**調用**函數。點擊(clickMe.popup());'**調用**'clickMe.popup()'並將返回值傳遞給'click',就像'foo(bar() )'**調用**'bar'並將其返回值傳遞給'foo'。 –