关于立即函数的几个问题

eisldkw 2020-10-06 08:38:07


立即函数
1、方式一

(function () { // open IIFE
// inside IIFE
}()); // close IIFE
2、方式二
(function () { // open IIFE
// inside IIFE
})(); // close IIFE

问题如下:

1、方式1 中 (function(){}()) 中 function(){}后加一()如何理解

2、方式2 中 ()后接一(),如何理解

3、为什么
function () { // open IIFE
// inside IIFE
}(); // close IIFE

这种形式不可以?

4、立即执行函数必须是表达式 ,这个表达式 到底 是什么意思, 搞不懂 ,一头 雾水呀。
...全文
6021 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
天际的海浪 2020-10-08
  • 打赏
  • 举报
回复
这是我自己总结的,不是书上讲的
eisldkw 2020-10-08
  • 打赏
  • 举报
回复
引用 3 楼 天际的海浪 的回复:
因为function(){}有两种语法。 首先说明一下: js中的函数实际上是一个Function对象。一个函数后面的()实际上是执行Function对象的运算符。 当function关键字出现在行首或者出现在{或;或if()、else、for()等语句之后,它是一条“函数声明的语句”,作为“语句”是没有返回结果的。所以不能用“语句”后面加()来执行函数。 当function关键字不是出现在行首或者不是出现在{或;或if()、else、for()等语句之后,它就是一条“函数表达式”,作为“表达式”就有返回结果了,会返回一个Function对象的引用地址。就可以用“表达式”后面加()来执行函数。 (function(){。。。。。})() (function(){。。。。。}()) 都是为了不让function关键字出现在行首。 就类似4+5,不让4出现在行首,可以写成 (4)+5 或 (4+5) 除此以外还可以用 [function(){。。。。。}()] ~function(){。。。。。}() +function(){。。。。。}() -function(){。。。。。}() !function(){。。。。。}() 只要能不让function关键字出现在行首,又符合js语法的都可以。 如果就是在一个表达式中使用,可以直接用 var txt = function(){。。。。。}(); 要注意这时txt的值是函数执行后 return 返回的结果,而不是函数的本身了。
非常感谢。请问您所说的这些什么书上有讲?
天际的海浪 2020-10-08
  • 打赏
  • 举报
回复
因为function(){}有两种语法。 首先说明一下: js中的函数实际上是一个Function对象。一个函数后面的()实际上是执行Function对象的运算符。 当function关键字出现在行首或者出现在{或;或if()、else、for()等语句之后,它是一条“函数声明的语句”,作为“语句”是没有返回结果的。所以不能用“语句”后面加()来执行函数。 当function关键字不是出现在行首或者不是出现在{或;或if()、else、for()等语句之后,它就是一条“函数表达式”,作为“表达式”就有返回结果了,会返回一个Function对象的引用地址。就可以用“表达式”后面加()来执行函数。 (function(){。。。。。})() (function(){。。。。。}()) 都是为了不让function关键字出现在行首。 就类似4+5,不让4出现在行首,可以写成 (4)+5 或 (4+5) 除此以外还可以用 [function(){。。。。。}()] ~function(){。。。。。}() +function(){。。。。。}() -function(){。。。。。}() !function(){。。。。。}() 只要能不让function关键字出现在行首,又符合js语法的都可以。 如果就是在一个表达式中使用,可以直接用 var txt = function(){。。。。。}(); 要注意这时txt的值是函数执行后 return 返回的结果,而不是函数的本身了。
  • 打赏
  • 举报
回复
qybao 2020-10-06
  • 打赏
  • 举报
回复
问题1 相当于 a=function(){};//a是方法对象或函数指针 a();//括号是方法调用 如果方法有参数 a=function(str){}; a(”test”);//就不光是括号了,还要带参数 问题2 括号作用同问题1 问题3 效果等同于问题2,只不过问题2的方法对象用括号括起来。按照优先级,该括号有无不影响结果 问题4 function(str){};只是方法定义,所以不是表达式,但方法调用是表达式,所以要function(str){}();前面的function(str){}代表方法对象(或函数指针),后面的括号表示方法调用。

87,993

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧