4

通常,我看到表单实现的功能关闭

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

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

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

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

这可能吗?

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

4

4 回答 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() {

    };
}());

虽然两者都是函数表达式

于 2011-07-08T20:42:55.847 回答
2

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

您实际要查找的代码是:

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

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

如果您准确地发布您正在尝试做的事情,可能会有另一种解决方案。

于 2011-07-08T20:40:10.773 回答
1

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

function closedF(fn){
    return fn;
}

并使用它:

var fnParam = function(){...};
...
closedF(fnParam);
于 2011-07-08T20:10:40.287 回答
1

你的意思是这样的:

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

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

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

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

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

于 2011-07-08T20:02:19.763 回答