javascript匿名函数参数传递

Jos*_*ose 19 javascript

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

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

我是javascript的新手,所以尽我所知,实际上将me变量传递给匿名函数.我想知道是否有一种更具声明性的方式呢?我想要的东西是:

var handler = (function(o) { o.progress();})(this));
Run Code Online (Sandbox Code Playgroud)

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

更新:

我的问题的根源是/我对javascript范围和闭包的理解不清楚.我发现这篇文章可以帮助我理解更多.

Poi*_*nty 29

你可以使用".bind()":

var handler = function() { this.progress(); }.bind(this);
Run Code Online (Sandbox Code Playgroud)

新的浏览器具有"bind()",并且Mozilla文档具有可用于修补旧浏览器的可靠实现.

  • 对我的情况更简洁的解决方案是`var handler = this.progress.bind(this)`.感谢您的输入! (3认同)

hug*_*omg 6

原因

var handler = (function(o) { o.progress();})(this));
Run Code Online (Sandbox Code Playgroud)

不起作用,因为它只是立即调用anon函数,因此立即调用o.progress()并分配anon函数(undefined)的返回值handler.您需要从外部函数返回实际函数:

handler = (function(me){
    return function(){
        return me.progress();
    }
}(this));
Run Code Online (Sandbox Code Playgroud)

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


顺便说一句,如果进度函数没有任何this内部调用,那么只做handler = this.progress(没有parens)就足够了.


Mar*_*ijn 5

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

您的handler函数将被调用setInterval,它通过零参数.这意味着您不能在处理函数本身中使用参数.

真的me明确传递,你可以编写一个接受参数的函数,并让该函数返回一个没有参数的匿名函数,但是它可以访问creator函数的参数:

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

但这基本上增加了一层重定向,而没有真正使它更清晰.除非你在外面拉动创建功能:

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

// ...

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