在分析时定义封闭功能?

时间:2011-07-08 19:59:09

标签: javascript closures function-declaration

通常,我看到通过表单

实现的函数闭包
var closedF = (function()
{
    return function(){/* return value */}
})();

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

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

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

这可能吗?

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

4 个答案:

答案 0 :(得分: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 shows in his answer

<强>更新

你也可以这样做:

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

    };
}());

虽然两者都是函数表达式

答案 1 :(得分:2)

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

您实际需要的代码是:

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

最终,甚至没有一个有效的用例来满足您的需求。闭包的关键是你可以获得对程序执行期间传入的外部变量的引用,这些变量可用于特定函数。如果您在编译期间尝试执行此操作,则您已经可以访问您尝试获取的任何内容,因为尚未执行任何系统。因此,不需要关闭。

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

答案 2 :(得分:1)

你的意思是这样的:

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

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

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

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

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

答案 3 :(得分:1)

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

function closedF(fn){
    return fn;
}

使用它:

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