Javascript 如何将onclick与函数表达式而不是声明的函数一起使用?

Javascript 如何将onclick与函数表达式而不是声明的函数一起使用?,javascript,onclick,Javascript,Onclick,我有一个钮扣 var startButton = $('#startButton').get(0); 我将vanilla javascript onclick方法附加到按钮上,并在单击时调用start startButton.onclick = start; 我想使用一个函数表达式,但(由于提升?)它不调用start var start = function() { console.log('requesting local stream'); startButton.disable

我有一个钮扣

var startButton = $('#startButton').get(0);
我将vanilla javascript onclick方法附加到按钮上,并在单击时调用start

startButton.onclick = start;
我想使用一个函数表达式,但(由于提升?)它不调用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;
所以它可以和函数表达式一起工作


谢谢

我同意您的观点,这是一个提升问题,您必须在设置
startButton.onclick=start之前查看代码以适当提升它

下面是关于语法的说明:

它特别提到函数可以声明或表示。对我来说,这再次导致了选择,因为函数声明是自动挂起的


for
onclick
使用函数声明。我在这里更改了示例,使用了您希望使用的函数表达式。在正确提升的情况下,当您单击按钮时,它正在调用正确的方法。

根据您对问题的描述判断,您似乎在将其分配给
开始按钮后声明(并定义)
开始。在这种情况下,
startButton.onclick
确实是
未定义的

被提升的是变量本身——您的代码知道它已被声明,但还不知道它的值,因为赋值发生在代码中的确切位置。这样想:当您使用
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
}

事件附件必须在创建函数表达式之后发生

结帐

点击
点击2
$(函数(){
var startButton=$(“#单击”).get(0);
var startButton2=$(“#click2”).get(0);
startButton.onclick=clickFunc;//不起作用
var clickFunc=函数(){
警报(“点击”);
};
开始按钮2.onclick=clickFunc;//工作
});

谢谢亚当-看起来这是最好的方式。嘿,威尔,别忘了标记答案。:-)
<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
});