为了账号安全,请及时绑定邮箱和手机立即绑定

小白,请教各位大佬!js中()的作用求老司机指点!

小白,请教各位大佬!js中()的作用求老司机指点!

烙印99 2019-08-14 00:26:49
问题描述a=(functionfoo1(){})functionfoo2(){}为什么执行完后,输入foo1是undefined,()的作用是立即执行,难道foo1是声明在局部作用域
查看完整描述

2 回答

?
莫回无

TA贡献1865条经验 获得超7个赞

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

TA贡献1830条经验 获得超3个赞

()不会规划作用域,这里的使用()是无意义的,等同于a=functionfoo1(){}。
这是具名的函数声明形式,函数最终作为a的值,所以在全局作用域中是不存在foo1的。
                            
查看完整回答
反对 回复 2019-08-14
  • 2 回答
  • 0 关注
  • 305 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信