JavaScript传递参数问题

时间:2011-05-16 22:10:07

标签: javascript reference

我有以下代码

for (var i = 0; i < that.$el.mini.length; i++) {
            var pag = that.$el.mini[i].pagination;
            // Mini-Slider Pagination
            $('li', pag).each( function(j, el) {
                $(el).click( function() {
                    /*
                     * Toggle Mini-Slide
                     */
                    that.slider_fn.mini.show(i, j);
                    return false;
                });
            });
        }

所以,基本上,我想要做的是在单击元素时运行此函数that.slider_fn.mini.show(i, j);

问题是我想使用变量i,它在循环中更改其值。单击元素后,i将被视为最新数字,即that.$el.mini.length

如何使JavaScript(或函数)记住该特定数字?

4 个答案:

答案 0 :(得分:4)

使用闭包来关闭i

$(el).click( (function(i_){
  return function() {
     that.slider_fn.mini.show(i_, j);
     return false;
  };
})(i));

事先,您的函数引用了名为i的变量,现在每次迭代时都会创建一个引用i_的新函数,并且此变量对每个函数都是唯一的,并引用{{i的值。 1}}创建函数时。

答案 1 :(得分:2)

您需要创建一个函数闭包,并将要保留的变量作为参数传递,如下所示:

for (var i = 0; i < that.$el.mini.length; i++) {
    var pag = that.$el.mini[i].pagination;
    $('li', pag).each(function (j, el) {

        // function closure to persist i, j, and el
        (function (idx, jdx, elem) {
            $(elem).click(function () {
                that.slider_fn.mini.show(idx, jdx);
                return false;
            });
        } (i, j, el));

    });
}

答案 2 :(得分:1)

给出的闭包答案是解决问题的常规方法,但如果您不关心自我调用的匿名函数,您可以考虑使用forEach()

that.$el.mini.forEach(function (element,i){
            var pag = element.pagination;
            // Mini-Slider Pagination
            $('li', pag).each( function(j, el) {
                $(el).click( function() {
                    /*
                     * Toggle Mini-Slide
                     */
                    that.slider_fn.mini.show(i, j);
                    return false;
                });
            });
        }) ;

警告: forEach()未在所有浏览器中实施。您可以看到如何填充它,如https://developer.mozilla.org/en/JavaScript/Reference/global_objects/array/foreach

中的“兼容性”所述

答案 3 :(得分:0)

这假设pag是一个元素,并且您正在使用jquery。

for(var i = 0; i&lt; that。$ el.mini.length; i ++){

var pag = that.$el.mini[i].pagination;

// Mini-Slider Pagination
$('li', pag).each( function(j, el) {

    $(el).data('page-index', i); // add data to the element being clicked
    $(el).click( function() {

        /*
         * Toggle Mini-Slide
         */
        that.slider_fn.mini.show($(this).data('page-index'), j);

        return false;
    });
});

}