将参数传递给名称引用的回调函数

时间:2013-08-18 09:08:46

标签: javascript jquery

我希望能够看到绑定事件时可用的回调函数内部的值。如果在绑定事件时定义了函数,那么在函数内部我可以通过闭包看到值:

var number = 777;
$('span').click(function() { 
    alert(number); //alerts 777  - available through closure
});

但是如果先前在'number'变量不可用时定义了该函数,则该技巧将不起作用。如果函数以这种方式绑定到事件,则函数number_alerter无法看到'number'变量:

$('span').click(number_alerter);

似乎唯一的解决方案是使用'number'参数定义函数并将'number'varible传递给函数:

//function defined somewhere earlier
function number_alerter(e, number) {    
    alert(number);
}
...
//current scope
var number = 777;
$('span').on('click', function(e) { 
    return number_alerter(e, number);
});

我的问题是,是否有另一种方法可以将此变量传递给'number_alerter'函数?也许通过关闭也可以吗?

编辑: 以下是可能需要上述情况的真实情况。我有两个功能:

array_sort(array, compare_function)
compare_values(value1, value2, case_insensitive)

函数array_sort只传递compare_values函数两个值,而使用函数array_sort时也应该传递第三个不区分大小写的参数。我知道如何做的唯一方法是将compare_values函数包装到另一个函数中:

var my_array = [];
var case_insensitive = true;
var wrapper = function(value1, value2) {
    compare_values(value1, value2, case_insensitive)
}
array_sort(my_array, wrapper);

我还有其他办法吗?

2 个答案:

答案 0 :(得分:1)

您可以使用number_alerter返回回调函数,并使用闭包。喜欢这个

function number_alerter(num) {
    return function(){alert(num);};
}

// different scope
var number = 777;
$('span').on('click', number_alerter(number));

请参阅jsFiddle

答案 1 :(得分:0)

你的问题必须在别的地方。据您所述,以下

var number=777;
var alerter=function(){
    alert(number);
};
$("span").click(alerter);

工作得很好。参看JSFiddle 并且,是的,如果您需要访问已定义的状态(例如,为每个跨度定义一个点击计数器),那么使用闭包就可以完成它。

编辑:哦,我明白了

$('span').click(
    (function() {
        return number_alerter})());

这不是这样做的方法。你必须在此时传递函数名称。