javascript匿名函数参数传递

时间:2011-05-31 14:10:52

标签: javascript

我有一些javascript代码(在一个对象中):

toggle: function() {
    var me = this;
    var handler = function() { me.progress() };
    me.intervalId = setInterval(handler, me.intervalTime);
    //...More code
}

我是javascript的新手,所以我可以告诉他实际上将me变量传递给匿名函数。我想知道是否有一种更具说明性的方式呢?我想要的是:

var handler = (function(o) { o.progress();})(this));

但这似乎不起作用......我错过了什么吗?这是“这是语言的工作方式,只需声明一个局部变量并处理它”的情况吗?

更新

我的问题的根源是/我对javascript范围和闭包的理解不清楚。我发现this article可以帮助我理解更多内容。

5 个答案:

答案 0 :(得分:29)

您可以使用“.bind()”:

var handler = function() { this.progress(); }.bind(this);

新浏览器具有“bind()”,Mozilla docs具有可用于修补旧版浏览器的可靠实现。

答案 1 :(得分:6)

原因

var handler = (function(o) { o.progress();})(this));

不起作用,因为它只是立即调用anon函数,因此立即调用o.progress()并将anon函数的返回值(未定义)赋给handler。您需要从外部函数返回实际函数:

handler = (function(me){
    return function(){
        return me.progress();
    }
}(this));

另一方面,这是等效的,就像变量赋值一样糟糕(但仍然有用,特别是如果需要在循环中完成,改变i而不是修复它)


顺便说一句,如果进度函数内部没有对this的任何调用,只需执行handler = this.progress(没有parens)就足够了。

答案 2 :(得分:5)

匿名函数可以访问me,因为它是在外部函数(toggle函数)中声明的;它由外部函数关闭

handler函数将由setInterval调用,它只传递零参数。这意味着您不能在处理函数本身中使用参数。

确实想要明确地传递me,你可以编写一个接受参数的函数,并让该函数返回一个没有参数的匿名函数,但可以访问创建函数的函数参数:

toggle: function() {
    var me = this;
    var handler = (function (o) { return function() { o.progress() }; })(me);
    me.intervalId = setInterval(handler, me.intervalTime);
    //...More code
}

但这基本上增加了一层重定向而没有让它更清晰。除非你把创建函数拉到外面:

function createProgressHandler(o) {
    return function() {
        o.progress();
    };
}

// ...

toggle: function() {
    var me = this;
    var handler = createProgressHandler(me);
    me.intervalId = setInterval(handler, me.intervalTime);
    //...More code
}

答案 3 :(得分:1)

你有什么关闭。创建并分配给handler的函数会保留对me对象的引用。这是正常的,日常的JavaScript,这就是闭包的一般工作方式。

答案 4 :(得分:0)

您是否尝试过返回此功能?

var handler = function(o){
   return function(){
      o.progress();
   }
}(me);

现在你可以致电:

handler();