在解析时定义闭包函数
Define closed-over function at parse time?
通常,我看到函数闭包是通过
形式实现的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()
来执行,但我不知道它是否可能作为声明。
- 使用闭包/函数绑定将自函数作为回调传递
- 了解 JavaScript 闭包函数
- 传递多个参数的闭包函数
- 将“(0)”附加到此闭包函数的目的是什么
- 如何复制(新实例)闭包函数
- Javascript 闭包函数参数
- 具有闭包函数作用域的意外行为
- javascript闭包函数可以由用户更改吗
- Javascript:是这个闭包函数
- 为什么闭包函数中的 javascript 变量在多次调用时不会重置为默认值
- Js闭包:函数在第二次调用时失败
- 如何存储闭包函数返回的变量
- javascript闭包函数的用法
- JavaScript闭包函数传递给事件监听器
- 闭包函数问题
- & # 39;这个# 39;匿名闭包函数内部
- 在JavaScript中实现自动记忆(返回闭包函数)
- 不理解闭包函数是如何工作的
- Javascript闭包函数
- 为javascript闭包函数编写jasmine测试规范