将可选参数传递给jQuery中的javascript函数

时间:2012-03-06 17:16:57

标签: javascript jquery

我正在尝试将可选参数传递给jQuery中的javascript函数。在下面的例子中,接收参数的函数是'foo'。它通过参数的第二个jQuery工作正常。 jQuery的第一部分没有我传入的任何参数,但jQuery似乎仍然传递一个对象。

最终我希望'bar'成为可选参数,如果我没有传入任何内容,则设置为0.

    //jQuery Bit #1       
    $('#id').change(foo);

    //jQuery Bit #2
    $('#id2').click(function(e){
            var bar = $(e.target).text();
            foo(bar);
          });

    function foo(bar) {
            if (!bar) var bar = 0;
           //do stuff here
          }

由于jQuery传入一个对象,我应该将'bar'作为对象传入并检查它作为对象的属性吗?或者我是否遗漏了jQuery在这种情况下应该使用jQuery做的事情?

3 个答案:

答案 0 :(得分:4)

这里jQuery将事件对象传递给click回调,这是设计的。如果你想让jQuery在没有参数的情况下调用回调,那么你需要将它包装在lambda中并明确地不传递参数

$('#id').change(function() { foo(); });

答案 1 :(得分:1)

两个选项:要么总是传递事件对象,要么永远不要:

始终:

//jQuery Bit #1       
$('#id').change(foo);

//jQuery Bit #2
$('#id2').click(function(e){
        var bar = $(e.target).text();
        foo(e, bar);       // <== Note change here
      });

function foo(e, bar) {
        if (!bar) bar = 0; // <== no "var" on this line
      }

从不:

//jQuery Bit #1       
$('#id').change(function() { foo(); } ); // <=== Note change here

//jQuery Bit #2
$('#id2').click(function(e){
        var bar = $(e.target).text();
        foo(bar);
      });

function foo(bar) {
        if (!bar) bar = 0; // <== no "var" on this line
      }

请注意,您不能在var的任何位置使用foo来声明barbar是一个参数,但您可以分配给它。


FWIW:另请注意,在您的示例中,bar将是字符串(目标元素的文本)或数字(0)。这种不一致可能会让您感到困惑,您可能会考虑使用parseIntparseFloat来获取文本(假设它应该始终是一个数字):

var bar = parseInt($(e.target).text(), 10); // 10 = I'm assuming decimal

var bar = parseFloat($(e.target).text());   // parseFloat always assumes decimal

如果没有文字,或者它不是可解析的数字,则bar将为NaN,而foo中的代码将为0(因为{{1}是} !NaN)。

答案 2 :(得分:1)

我相信如果您将函数重写为

,您的代码将会起作用

编辑:代码已修复。

//jQuery Bit #1       
$('#id').change(foo); // will be effectively invoked as "foo(event, undefined)"

//jQuery Bit #2
$('#id2').click(function(e){
        var bar = $(e.target).text();
        foo(null, bar);
      });

function foo(unusedEvent, bar) {
        bar = bar || 0;
       //do stuff here
}