2014-12-18 69 views
8

我有一個按鈕如何使用函數表達式而不是聲明函數使用onclick?

var startButton = $('#startButton').get(0); 

我香草的JavaScript的onclick方法附加到按鈕並單擊呼叫啓動。

startButton.onclick = start; 

我想用一個函數表達式,但(由於吊裝?)這個不叫啓動

var start = function() { 
    console.log('requesting local stream'); 
    startButton.disabled = true; 
    getUserMedia(constraints, gotStreamSuccess, errorCallback); 
} 

聲明的功能不

function start() { 
    console.log('requesting local stream'); 
    startButton.disabled = true; 
    getUserMedia(constraints, gotStreamSuccess, errorCallback); 
} 

我怎麼能寫

startButton.onclick = start; 

因此它可以與函數表達式?

感謝

+0

威爾,不要忘記,以紀念一個答案。 :-) – Adam

回答

2

我將與你,這是一個提升問題上達成一致,你必須在代碼中尋找適當設置startButton.onclick = start;前扯起了。

這裏是MDN不得不說的語法: Syntax for on click

它特別提到,該函數可以被宣佈表示。對我而言,這又會導致升降,因爲函數聲明會自動升起。

MDN對於onclick使用函數聲明。我將這個JSFiddle中的示例更改爲使用函數表達式,就像您想要的那樣。在正確提升的情況下,當您點擊按鈕時,它會調用正確的方法。

+0

感謝亞當 - 看起來非常像宣佈是最好的方式去這個 – WillLA

2

你的問題的描述來看,你似乎聲明(和定義)start其分配給startButton.onclick後。在這種情況下,startButton.onclick確實是undefined

變量本身 - 你的代碼知道它已經被聲明,但還不知道它的值,因爲賦值發生在代碼中的確切位置。可以這樣想:當你使用關鍵字var時,你聲明瞭一個變量,但是這個變量還沒有定義。如果您恰好立即爲其分配值,則新值對分配上方的代碼不可見。

請看下面的例子:

var a = 1; 
console.log(a); 
var a = 2; 
var a = 3; 

這三個值,你會期望在控制檯中記錄的一個? 1,2或3?
您可以根據需要多次使用var作爲單個標識符(儘管我不會推薦它)。簡單地忽略連續的聲明,只考慮分配。因此,不能懸掛任務。

然而,函數聲明在某種意義上是有限的,它們可以被整體提升,這就是爲什麼在你的情況下使用函數聲明的原因。

爲了解決這個問題,你確實可以使用函數聲明,或者在startButton.onclick = start;之前執行變量賦值(並且我認爲在這種情況下你並不需要變量,函數聲明完全適合這個任務)。

請注意,你也可以這樣做:創建函數表達式後必須發生

startButton.onclick = function() { // I'm a function expression too! 
    // do something here 
} 
0

事件附件。

結帳這個example

<button id="click">Click</button> 
<button id="click2">Click2</button> 

$(function(){ 

    var startButton = $("#click").get(0); 
    var startButton2 = $("#click2").get(0); 

    startButton.onclick = clickFunc; // wont work 

    var clickFunc = function() { 
    alert('click'); 
    }; 

    startButton2.onclick = clickFunc; // work 
});