- 首先,
()操作符有两种用法,一是作为圆括号运算符,提升括号内表达式的优先级;二是作为函数调用操作符,用于执行在()操作符之前指向的函数名 - 其次,函数有函数声明和函数表达式两种声明形式,前者形如:
function name([param,[, param,[..., param]]]) { [statements] }
讯享网而函数表达式则是:
- 在函数表达式中,前边的 function_expression 如果存在,这就是个具名函数表达式;而反之则是匿名函数表达式。表达式里的 name 加的是方括号,表示可选:因为这个函数声明是被“禁锢”在 function_expression 变量里的,换句话说,它可以用
function_expression()这种形式来调用(所以有没有名字其实无所谓了,因为函数名外部不可见)。讯享网
let function_expression = function [name]([param1[, param2[, ..., paramN]]]) { statements }; - 再说匿名函数表达式。
匿名函数表达式,形如:function ([param,[, param,[..., param]]]) { [statements] }说白了就是函数声明不留名。做好事不留名可以,做函数不留名,...那怎么调动?所以这种形式单独存在的话,不合法。所以要怎么办?这时就出现了 IIFE,也就是立即调用函数表达式/自执行函数表达式。它的根本思想很简单,先用圆括号操作符把表达式本体罩住,表示“我罩你”,再在末尾加个函数调用操作符,表示“放胆做”,这俩加一块,就是“立即执行”:
讯享网
(function ([param,[, param,[..., param]]]) { [statements] })()(当然还有几种其它形式的,但先学标准的吧)
- 这些 balabala 的都看下来,你的问题也应该能有个解释了。(另外结下稿费,谢谢......
- 参考资料:
- MDN:圆括号运算符
- MDN:函数
- MDN:函数表达式
- MDN:IIFE
🌰:
(function foo1(){}) foo1() //Uncaught ReferenceError: foo1 is not defined (function foo1(){console.log("haha")})() //haha (function foo1(){console.log("haha")}()) //haha
包一下相当于一个匿名函数,拥有独立的作用域,对外不可见。参考资料里 IIFE 见详解。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/38500.html