2014-12-18 34 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 
});