首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >javascript匿名函数参数传递

javascript匿名函数参数传递
EN

Stack Overflow用户
提问于 2011-05-31 22:10:52
回答 5查看 39K关注 0票数 19

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

代码语言:javascript
复制
toggle: function() {
    var me = this;
    var handler = function() { me.progress() };
    me.intervalId = setInterval(handler, me.intervalTime);
    //...More code
}

我对javascript还是个新手,所以就我所知,这样做实际上是将me变量传递给匿名函数。我想看看是否有一种更具说明性的方式来做到这一点?我想要的东西大致是:

代码语言:javascript
复制
var handler = (function(o) { o.progress();})(this));

但这似乎并不管用...我是不是遗漏了什么?这是一种“这就是语言的工作方式,所以只需声明一个局部变量并处理它”的情况?

更新:

我的问题的根源是我对javascript中的作用域和闭包的理解不清。我发现this article可以帮助我更好地理解它。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-05-31 22:15:13

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

代码语言:javascript
复制
var handler = function() { this.progress(); }.bind(this);

新的浏览器有"bind()",而Mozilla docs有一个可靠的实现,你可以用它来修补旧的浏览器。

票数 30
EN

Stack Overflow用户

发布于 2011-05-31 22:24:26

原因

代码语言:javascript
复制
var handler = (function(o) { o.progress();})(this));

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

代码语言:javascript
复制
handler = (function(me){
    return function(){
        return me.progress();
    }
}(this));

另一方面,这与变量赋值一样糟糕,看起来也一样糟糕(但仍然很有用,特别是如果这需要在循环中完成,使用更改的i而不是固定的this)。

顺便说一句,如果进度函数内部没有任何对this的调用,那么只执行handler = this.progress (不带括号)可能就足够了。

票数 6
EN

Stack Overflow用户

发布于 2011-05-31 22:34:19

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

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

如果你真的想显式地传递me,你可以编写一个接受参数的函数,并让该函数返回一个没有参数的匿名函数,但它可以访问创建者函数的参数:

代码语言:javascript
复制
toggle: function() {
    var me = this;
    var handler = (function (o) { return function() { o.progress() }; })(me);
    me.intervalId = setInterval(handler, me.intervalTime);
    //...More code
}

但这基本上增加了一层重定向,并没有真正使其更易读。除非你把这个创建函数拉到外面:

代码语言:javascript
复制
function createProgressHandler(o) {
    return function() {
        o.progress();
    };
}

// ...

toggle: function() {
    var me = this;
    var handler = createProgressHandler(me);
    me.intervalId = setInterval(handler, me.intervalTime);
    //...More code
}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6188861

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档