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