函数里面返回函数到底有什么用呢?

经常会看到这样关于函数的写法:

var cal = function(a) {
    var plus = function() {
        return a + 1;
    }
    
    return plus;
}

var fn = cal(3)();


我了解这个地方主要是使用了闭包。
但是一般像这种函数里面再返回函数的写法有什么用呢?或者说运用在哪些场景里面?

阅读 3.5k
3 个回答

像这种用法最大的用处是:“延迟一个函数的执行,让它仅在需要时才会执行,但其执行环境会被一直保留到执行时(闭包)”。

最常见的例子是在绑定事件的时候需要带上参数,一种方法是把参数定义为全局变量:

var a = 123;
xxx.onclick = function() {
    alert(a);
};

但这样做会严重污染全局变量,尤其是需要绑定的事件很多的时候。而且这种方法在通过代码动态绑定事件时也不方便。例如我想给2个对象绑定同一个事件,但是参数不一样,此时用上面的代码就不好处理了。

这时候就是高阶函数发挥用武之地的时候了:

var getHandler = function(a) {
    return function() {
        alert(a);
    };
};
xxx1.onclick = getHandler(123);
xxx2.onclick = getHandler(456);

当然,场景不局限于添加事件。只要是需要延迟执行一个函数,但又想让该函数记住执行环境,这时候就可以用到高阶函数。

1、防止变量污染全局变量,在闭包里定义的变量,外部是不可以访问的,比如a你可以在这里面任意使用,但是不影响在其他地方重新定义一个a

2、 高阶函数,应该说闭包只是高阶函数实现的时候出现的一个特征而已。
这样做的好处就是可以用函数生成函数。简单来说,比如有个加法的函数:

function  add(a){
   var adda = function(b){
        return a+b;
   }
   return adda;
}

有了这样一个函数,当我们需要一个 +3 的函数的时候,就可以var add3 = add(3)
需要+4的函数时候就可以var add4 = add(4);
好处就是,实现了一个稍微复杂一点儿的函数,就可以生产很多相对简单的函数,这样可以提高代码的复用。

如果不返回函数的话,你是不能调用的,调用的时候会报错的:

Uncaught TypeError: cal(...) is not a function(…)

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题