Javascript 实际上从哪里调用IIFE?

Javascript 实际上从哪里调用IIFE?,javascript,iife,Javascript,Iife,看一个简单生活的例子 ((x) => x)(1) // returns 1 如果我用一个可以作为回调传递的常规(但匿名)函数来考虑这一点: setTimeout(function() {alert(1)}, 1000) 匿名函数仍在被调用。IIFE类似于作为回调传递给某个返回函数的函数 看起来这个返回的函数然后被一个参数1调用,然后IIFE被某个函数返回的函数调用 这是正确的吗?某个函数定义在什么对象上?它是窗口/全局的吗?或者这是一个JavaScript实现特性而不是语言特性 IIF

看一个简单生活的例子

((x) => x)(1) // returns 1
如果我用一个可以作为回调传递的常规(但匿名)函数来考虑这一点:

setTimeout(function() {alert(1)}, 1000)
匿名函数仍在被调用。IIFE类似于作为回调传递给某个返回函数的函数

看起来这个返回的函数然后被一个参数
1
调用,然后IIFE被某个函数返回的函数调用

这是正确的吗?某个函数定义在什么对象上?它是窗口/全局的吗?或者这是一个JavaScript实现特性而不是语言特性

IIFE类似于作为回调传递给某个返回函数的函数

没有

    f(1)
只有一个函数调用:
f
直接调用

仍然只有一个函数调用。该代码相当于
f(1)
;只是添加了一些多余的参数

我们不局限于调用变量。我们可以使用我们想要的任何表达式(只要它的计算结果是函数):

我们不能只写
function(){…}()
的唯一原因是
function
关键字不能出现在语句的开头(如果出现,它将被解析为函数声明的开头,而不是函数表达式)。但是,例如

void函数(){console.log(“hello”);}();

log(函数(x){returnx+1;}(1))
setTimeout(function(){alert(1)},1000)
这是一个IIFE上的任何内容
IIFE看起来像是作为回调传递给某个返回函数的函数。
该描述与您的两个示例都不匹配。IIFE是一个立即调用的函数表达式。第一个例子是一个生命,因为…你立即执行它。但你哪儿都不能通过。第二个例子没有生命。非常简单的一个iLife就是或多或少地定义
myFynction(a){returna+1}
,然后执行它
myFunction(2)//returns 3
,但不是两行。可能有用的资源:
只是添加了一些冗余参数。
在这种情况下可能是冗余的,但在一般情况下不是冗余的。到1点了。明确点这是一种生活和2。为了防止未包装的IIFE进行一些不直观的分析。@vlaz如果
函数
出现在语句的开头,则它不是多余的。否则它是多余的。这意味着在一般情况下它不是多余的。另外,
a=function(){}()
可能很难理解,这取决于函数的长度,因此您可以假设
a
是一个函数,但实际上它是一个生命的值。“根据经验,虽然编写明确的代码在技术上可能是防止JavaScript解析器抛出SyntaxError异常所必需的,但编写明确的代码对于防止其他开发人员向您抛出“WTFError”异常也是相当必要的!”二进制运算符也可以用来代替括号。举个例子吧!函数(){}()也可以使用。@vlaz-True,但这只是惯例问题,不是硬性语言规则。您必须知道代码作者使用了哪些约定,因为没有什么可以阻止我编写
a=(function(){…})或者,这(尽管有帕伦斯)不是一种生活。
//     v v function call operator
    (f)(1)
//  ^ ^ grouping
(function (x) { ... })(1)

// equivalent to:
     let f = function (x) { ... };
     f(1);
// but without needing a temporary variable