为何使用一元运算符时,IIFE中的匿名函数可省略括号?
关于立即调用函数表达式(IIFE)的语法疑问解答
为什么用+、-等一元运算符时,IIFE的匿名函数不用加括号?
JavaScript的语法解析器会根据上下文区分函数声明和函数表达式:
- 直接写
function() {}时,解析器会把它当作函数声明,而函数声明的语法规则不允许在后面直接跟()调用(匿名函数声明本身还存在语法歧义)。 +、-、!、~这类一元运算符会强制把后面的function() {}转换成函数表达式——表达式是可以被求值的,所以后面直接跟()就能立即执行这个函数,不需要额外用括号包裹来强制转换上下文。
说白了,一元运算符就是告诉解析器:“这不是函数声明,是个可求值的表达式,你可以直接处理它并执行”。
两种写法功能是否等价?
核心功能(立即执行匿名函数)在多数场景下是一致的,但存在细微的返回值差异:
- 括号包裹的写法
(function() {})(),会直接返回函数执行后的结果。如果函数没有显式return,就返回undefined。 - 用一元运算符的写法,比如
+function() {}(),会对函数的返回值做对应的一元运算:- 若函数返回数字,
+会返回原数,-会返回负数; - 若函数返回
undefined,+undefined会得到NaN,-undefined也会得到NaN; - 若函数返回字符串,
+会尝试把它转换成数字(比如+function(){return "123"}()得到123)。
- 若函数返回数字,
如果你的代码不依赖函数的返回值,两种写法功能几乎没区别;但如果需要用到函数的返回结果,就得注意这个差异。
内容的提问来源于stack exchange,提问作者but like
相关产品推荐
相关产品推荐

