通常,我看到通过表单
实现的函数闭包var closedF = (function()
{
return function(){/* return value */}
})();
以便调用closedF()
返回内部函数的返回值。但我想使用函数声明创建closedF
(上面是函数表达式),以便在解析时定义它。即。
function closedF()
{
return function(){/* return value */}
}
但这不起作用,因为在调用closedF()
时,它返回内部函数而不是内部函数的返回值。注意:使用上面的声明我可以使用closedF()()
,但这只是不优雅。
这可能吗?
P.S。通常情况下,我有很多方法可以解决我的特定编程问题,但我实际上希望有人告诉我,封闭式函数不是JS中的“二等公民”函数。
答案 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);