我目前正在使用Openlayers 3库开发一个地图,需要了解回调函数。
然后我开始阅读并发现我一直在使用jQuery的回调函数。 我还读到你可以使用这些函数中可用的参数:
$('body').click(function(e){
e.preventdefault();
)}
''可以在函数中使用。
我的问题是:
我正在努力理解这一点,因为否则我将不得不使用全局参数,并且使用全局参数被认为是不良做法',对吗?
编辑:
因此,如果我想在上面的函数中添加一个额外的参数,那么这是否可行:
document.ready(function(){
var data = 6;
$('body').click(function(e, data){
e.preventdefault();
console.log(data);
})
})
答案 0 :(得分:1)
回调函数的参数记录在您正在使用的特定API中。
例如,可以在此处找到jQuery中click
- 方法的引用:https://api.jquery.com/click/
如果要向函数添加参数,可以使用函数外部的变量,它们将在该函数内部可用:
document.ready(function(){
var data = 6;
$('body').click(function(e){ // Note: don't add 'data' in the parameter here, it will overwrite your local variable with whatever jquery passes to the function.
e.preventdefault();
console.log(data); // data = 6, it's available from the outer function
})
})
由于在附加处理程序时不会执行回调(有时当您调用$("body").click()
时,您需要确保执行时可用的变量具有与附加句柄时相同的值。
说你有以下声明:
var data = 6;
$('body').click(function(e){
e.preventDefault();
console.log(data);
});
data = 10;
在上述情况下,console.log(data)
语句将输出10.为什么?因为到用户点击时,最后一个语句已经执行,并且已经修改data
以保持值10。
要解决此问题,您需要在闭包内捕获变量:
var data = 6;
$('body').click((function(myVar){
return function(e){
e.preventDefault();
console.log(myVar);
}
})(data));
data = 10;
此处,值6将记录到控制台。为什么?你没有将普通函数传递给click-handler,而是声明一个函数并立即执行它:
(function(){
})()
从这个IIFE(立即调用的函数表达式)中,返回另一个将用作click事件处理程序的函数。您将传输传递给IIFE的变量,并保持与附加点击处理程序时相同的值