在解析时定义闭包函数

Define closed-over function at parse time?

本文关键字:闭包 函数 定义      更新时间:2023-09-26

通常,我看到函数闭包是通过

形式实现的
var closedF = (function()
{
    return function(){/* return value */}
})();

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

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

,但这不起作用,因为当调用closedF()时,它返回内部函数而不是内部函数的返回值。注意:对于上面的声明,我可以使用closedF()(),但那只是不美观。

这可能吗?

注。通常情况下,我有很多方法来解决我的特定编程问题,但我实际上希望有人向我展示闭包函数在JS中不是"二等公民"函数。

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

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

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

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() {
    };
}());

虽然都是函数表达式

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

你实际要找的代码是:

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

最终,你所要求的甚至没有一个有效的用例。闭包的意义在于,您可以获得对程序执行期间传入的外部变量的引用,这些变量可用于特定函数。如果您试图在编译期间执行此操作,则由于还没有执行coe,因此您已经可以访问您试图获得的任何内容。因此不需要闭包。

如果你发布了你想要做的事情,可能还有其他解决方案。

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

function closedF(fn){
    return fn;
}

使用它:

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

你的意思是:

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

是的,这完全可以接受

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

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

这将创建一个函数,可以简单地通过调用closedF()来执行,但我不知道它是否可能作为声明。