jquery将变量传递给函数

时间:2010-02-18 14:48:20

标签: javascript jquery closures scope

干草伙计们,我正在制作一个简单的预加载功能

(function($) {
    $.fn.preload = function(settings) {

    var config = {
        before: function(){ return; },
        end: function(){ return; },
        after: function(a){ return; }
    };

    if (settings) $.extend(config, settings);

    var limit = this.length - 1;
    var counter = 0;

    settings.before();

    is_last_done = function(i){if (i == limit) return true;};

    this.each(function(i, src){
        $("<img>").attr("src", src).load(function(){

            if( a == counter ) settings.after();
            if(is_last_done(i)) settings.end(); // Last is done
            counter++;

        });
    });
    return this;
};
})(jQuery);

并用

调用它
    img = ['a.jpg', 'b.jpg', 'b.jpg'];

    a = 1;

    $(img).preload({
        before: function(){ return; },
        end: function(){  },
        after: function(a){
            console.log('first done');
        }
    });

问题是传递给'after()'函数的'a'变量没有被传递。

在插件内部,我可以使用'a'访问变量,就像在这一行

一样
if( a == counter ) settings.after();

'a'是可用的,但是如果我想将变量命名为其他东西怎么办?我如何访问after()函数的参数?

如果我使用此代码,我的代码将不再有效

img = ['a.jpg','b.jpg','b.jpg'];

b = 1;

$(img).preload({
    before: function(){ return; },
    end: function(){  },
    after: function(b){
        console.log('first done');
    }
});

b没有通过任何想法?

由于

2 个答案:

答案 0 :(得分:0)

变量可以在嵌套函数上访问,因为它位于外部closure,你不需要参数,你可以简单地使用它:

var img = ['a.jpg', 'b.jpg', 'b.jpg'];
var b = 1;

$(img).preload({
    before: function(){ return; },
    end: function(){  },
    after: function(){
        // b is accessible here.
        console.log(b);
    }
});

答案 1 :(得分:0)

如果我理解正确,您希望将迭代索引传递给.after()。

在你的插件中,变量计数器用于跟踪你所在的每个()迭代的哪一步。这是不必要的,因为每个步骤的第一个参数是循环索引。请参阅文档中的each

此外,函数is_last_done()不需要,因为limit变量在每个()调用的匿名函数的范围内。

var limit = this.length - 1;

settings.before();

this.each(function(i, src){
    $("<img>").attr("src", src).load(function(){

        if (i == a) settings.after(i);
        if (i == limit) settings.end();

    });
});

Javascript是词法范围的,因此您不必为函数执行任何操作来查看在封闭范围中声明的变量。这被恰当地称为闭包,并在本Mozilla文章中描述 - Working with Closures