Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript:回调函数与匿名函数–;为什么只有一个人开枪?_Javascript - Fatal编程技术网

JavaScript:回调函数与匿名函数–;为什么只有一个人开枪?

JavaScript:回调函数与匿名函数–;为什么只有一个人开枪?,javascript,Javascript,我注意到事件回调函数有些奇怪,我不确定发生了什么 给出以下示例: HTML 为什么按钮#1成功触发验证功能,而按钮#2没有 我猜这是因为匿名函数是动态计算的,而另一个不是,因此,validate尚未定义,但我不确定。有人能告诉我吗?这两个函数都是匿名的 这两个函数都是回调函数 第二个不会触发,因为在第一个位置(即,当值仍然未定义时)将验证的值传递给on() 如果使用了函数声明: function validate() { // ... } …那么它就会被吊起来,这样订单就无关紧要了 由

我注意到事件回调函数有些奇怪,我不确定发生了什么

给出以下示例:

HTML

为什么按钮#1成功触发
验证
功能,而按钮#2没有


我猜这是因为匿名函数是动态计算的,而另一个不是,因此,
validate
尚未定义,但我不确定。有人能告诉我吗?

这两个函数都是匿名的


这两个函数都是回调函数

第二个不会触发,因为在第一个位置(即,当值仍然
未定义时)将
验证
的值传递给
on()

如果使用了函数声明:

function validate() {
   // ...
}
…那么它就会被吊起来,这样订单就无关紧要了


由于您使用的是一个表达式(即调用
\uu.debounce
)的返回值),因此顺序并不重要

变量提升后实际运行的代码如下所示

$(function() {
  var validate; // NOTICE the validate variable is hoisted.
  var $button1 = $('#btn1');
  var $button2 = $('#btn2');

  $button1.on('click', function() {
    validate();
  });

  $button2.on('click', validate); // here, validate is undefined.

  validate = _.debounce(function() {
    alert('validate fired');
  });
});

因此,当您将validate置于
处理程序上的
时,它尚未定义

简单地说,第二次调用等于写入
$button2.on('click',未定义)由于
var变量
存在。第一次回调是指在警报函数被分配给它时,
var validate

您必须小心声明函数的方式。函数声明、函数表达式以及它们处理提升的方式之间存在差异

使用功能声明,功能始终处于提升状态

   //function declaration
    function validate() {
      //do stuff
    }
使用函数表达式,仅提升变量声明。变量赋值未被提升

//function expression
//unamed (anonymous function)
var validate = function() {
  //do stuff
}
因此,在您的示例中,按钮2的validate未定义

这里有一篇文章深入讨论了这个问题:

在将
一起使用之前,请声明
验证
取消公告方法。您可以补充说,使用
“使用严格”
可以通过完全失败来防止此错误。@LoïcFaure Lacroix-严格模式在这里没有什么区别。
   //function declaration
    function validate() {
      //do stuff
    }
//function expression
//unamed (anonymous function)
var validate = function() {
  //do stuff
}