调用一个命名的函数表达式

4

我可以像这样不用变量名称立即调用(调用)命名的函数表达式吗?

var bookingMask = function (ac) {
....
}('.selectDates');

但我认为你大多数情况下都想要其中之一,对了解情况有所帮助! - Nishant
2
你的代码中没有命名函数。由于你的问题标题与实际问题不符,你能否澄清一下你的意思? - slebetman
@slebetman是正确的,这个问题的答案也反映了这个问题。 - GrafiCode
你想在执行IFFE后使名称“bookinMask”可用吗?如果不是,@T.J. Crowder的答案就是你需要的。否则,你应该澄清一下。 - Nishant
在我看来,你需要在一行中使用一个“语句”和一个“表达式”。 - Nishant
2个回答

2
如果你真的是指“命名”函数表达式,那么是可以这样做的:最初的回答。
(function bookingMask(ac) {
    // ...
})('.selectDates');

注意使用()将其包裹起来。否则,function关键字会让解析器认为它是一个函数声明的开始,你不能以那种方式直接调用它。

如果你想在函数内部(例如递归)使用bookingMask,那么你可能需要这样做。

实时示例:

(function bookingMask(ac) {
    console.log("ac is: " + ac);     // "ac is: .selectDates"
    console.log(typeof bookingMask); // "function"
})('.selectDates');

如果您希望bookingMask是调用的结果,您也可以这样做:

最初的回答

var bookingMask = (function nameForTheFunctionHere(ac) {
    // ...
})('.selectDates');

如果您这样做,因为解析器已经期望在function关键字之后跟着一个表达式,所以您不需要包装器(),这是可以的:

最初的回答:

如果你这样写,因为解析器在function关键字后面已经期望一个表达式,所以你不需要用()来包装它,直接写即可:

var bookingMask = function nameForTheFunctionHere(ac) {
    // ...
}('.selectDates');

...但我仍然倾向于保留它们,因为在阅读代码时很容易忽略末尾的(...)


您也可以不使用名称(只需删除上面的bookingMask),但您确实明确提到了“命名”,所以... :-)


(如果有人想知道为什么这个答案有四个反对票,当我最初发布答案时,我错过了OP提到的命名函数表达式,主要是因为问题中没有这种情况。一些人很友好地让我知道,以便我可以修复它。但人们最初对错误的答案进行投票。)


1
有两种不同的声明函数的方法,你可以使用function declarationfunction expression。 'expression' 部分意味着它要么被赋值给一个变量 var func = function cat(){},要么使用括号告诉JavaScript引擎获取内部的值并将其作为表达式进行评估。因此,IFE(立即调用函数表达式)的名称来自首先将函数转换为表达式 (function(){}) 然后调用它 (function(){})()
所以在你的情况下,你不想评估函数'将其分配给一个变量',而是想一次性创建、分配和运行函数,像这样...
(function(ac) {
// code...
})('.selectDates');

如果你非常冒险,你也可以使用除了括号之外的其他运算符来评估IFFE,例如:
+function IFFE(){

}()

-function IFFE(){

}()

1
声明函数只有一种方法,函数表达式或立即调用函数(IIFE)的赋值不属于函数声明。;-) - RobG
如果您在IFFE中使用函数名称,则仍然在声明函数。 - Dan Starns
2
不,你不是。一个函数表达式,无论是否命名,都不是一个函数声明。 - RobG

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接