在解析时定义封闭函数?

问题描述 投票:0回答:4

通常,我看到函数闭包是通过表单实现的

var closedF = (function()
{
    return function(){/* return value */}
})();

以便调用

closedF()
返回内部函数的返回值。但我想使用函数声明(上面是函数表达式)创建
closedF
,以便在解析时定义它。即

function closedF()
{
    return function(){/* return value */}
}

但这不起作用,因为当调用

closedF()
时,它返回内部函数而不是内部函数的返回值。注意:通过上述声明,我可以使用
closedF()()
,但这不太优雅。

这可能吗?

附注通常情况下,我有很多方法可以解决我的特定编程问题,但我实际上希望有人告诉我封闭函数不是 JS 中的“二等公民”函数。

javascript closures
4个回答
3
投票

您的问题不一定与函数表达式与函数声明有关。

在您展示的两种情况下,您都没有获得内部函数的返回值。

可以通过调用内部函数并返回它的值来获取它:

function closedF() {
    return (function(){
        /* return value */
    }()); // <- calling the inner function here
}

缺点是调用外部函数时总是会重新定义内部函数。您可以通过将内部函数缓存为外部函数的属性来防止这种情况:

function closedF() {
    var func = closedF.__func ||  (closedF.__func = function(){
        /* return value */
    });
    return func();
}

但是,这可能更令人困惑而不是有帮助。

更简单的是立即执行外部函数并将返回的函数分配给变量,如 @James Long 在他的答案中所示

更新:

你也可以这样做:

(function() {
    window.closedF = function() {

    };
}());

虽然都是函数表达式


2
投票

这是不可能的。从闭包中获取函数的唯一方法是实际执行包装函数,当然,这在编译期间不可能发生。

您实际要查找的代码是:

var closedF = function(){
    return function(){
       // do stuff
    }
}(); // <-- note the (), which immediately calls the outer function

最终,对于您所要求的内容甚至没有有效的用例。闭包的要点是,您可以获取对程序执行期间传入的可用于特定函数的外部变量的引用。如果您尝试在编译期间执行此操作,那么您已经可以访问您尝试获取的任何内容,因为尚未执行 coe。因此没有必要关闭。

如果您准确地发布了您想要做的事情,可能还有另一种解决方案。


1
投票

您是否考虑过将函数作为参数传递?

function closedF(fn){
    return fn;
}

并使用它:

var fnParam = function(){...};
...
closedF(fnParam);

1
投票

你的意思是这样的:

function closedF() {
    return function () {
    }
}

是的,这是完全可以接受的

编辑:阅读评论,我认为你需要一个自动执行的匿名函数:

var closedF = (function () {
    return function () {
    };
}());

这将创建一个可以通过调用

closedF()
来简单执行的函数,但我不知道是否可以作为声明。

© www.soinside.com 2019 - 2024. All rights reserved.