js 中的自执行函数到底是怎么运行的?
首先我知道js函数分为函数声明和函数表达式。自执行函数我以前知道有两种第一种(function(){})();第二种;(function(){}());这两种是没有任何区...
首先我知道 js 函数分为函数声明和函数表达式。
自执行函数我以前知道有两种 第一种 (function(){})();第二种; (function(){}());这两种是没有任何区别的。
直到昨天我浏览别人博客的时候才知道自己就是井底之蛙,原来自执行函数还有其他写法。
比如: !function(){}(); || ~function(){}() || void funciton(){}();当然还有 + - 等。
以前就知道它可以执行,没有想过它是怎么执行的,今天就突然想理解。
此时我心里就很纳闷了,他是怎么让这个匿名函数执行的呢? 我也百度查过各位前辈的答案,几乎都是说前面加上一个符号就可以变成函数表达式来进行执行的。沃特? 函数表达式? 为什么变成函数表达式就可以这样执行了。函数表达式不也是要函数名字调用嘛? 这脑子就是转不过来这个弯了
这里摘抄一位前辈的一段话:
产生这个错误的原因是,Javascript引擎看到function关键字之后,认为后面跟的是函数声明语句,不应该以圆括号结尾。解决方法就是让引擎知道,圆括号前面的部分不是函数定义语句,而是一个表达式。
为什么是一个表达式就可以这样执行了???????
望各位前辈帮我解惑答案,这块折磨我好几天了。谢谢各位前辈!!! 展开
自执行函数我以前知道有两种 第一种 (function(){})();第二种; (function(){}());这两种是没有任何区别的。
直到昨天我浏览别人博客的时候才知道自己就是井底之蛙,原来自执行函数还有其他写法。
比如: !function(){}(); || ~function(){}() || void funciton(){}();当然还有 + - 等。
以前就知道它可以执行,没有想过它是怎么执行的,今天就突然想理解。
此时我心里就很纳闷了,他是怎么让这个匿名函数执行的呢? 我也百度查过各位前辈的答案,几乎都是说前面加上一个符号就可以变成函数表达式来进行执行的。沃特? 函数表达式? 为什么变成函数表达式就可以这样执行了。函数表达式不也是要函数名字调用嘛? 这脑子就是转不过来这个弯了
这里摘抄一位前辈的一段话:
产生这个错误的原因是,Javascript引擎看到function关键字之后,认为后面跟的是函数声明语句,不应该以圆括号结尾。解决方法就是让引擎知道,圆括号前面的部分不是函数定义语句,而是一个表达式。
为什么是一个表达式就可以这样执行了???????
望各位前辈帮我解惑答案,这块折磨我好几天了。谢谢各位前辈!!! 展开
1个回答
展开全部
其实不要被“函数表达式”的函数两字束缚了,其实就是“表达式”,这样一来就会好理解了。在表达式的前面加个逻辑运算符(比如!取反)或数学运算符(比如+),js就会认为你是要获取表达式的值,这样它就会去运行这个表达式,这样函数就会被执行了。比如说有下面这个函数声明:
function abc(){return true}
那么执行 !abc() 时js就会先去调用abc函数,然后再把返回值取反,这个好理解吧?
而现在把abc直接替换为匿名函数:
!function(){return true}()
js也一样会把!后面的部分当作一个表达式去运行,然后把取回的值进行取反,这个过程中匿名函数就会自动运行了。
其实 (function(){})(); 和 (function(){}()) 能够自执行的原理也是一样的,我加黑的那对括号其实也是运算符(就好比小学数学中的 (2+3)×4 中的括号),这样js就会把括号里的部分当作表达式来处理了。
所以,说到底函数的自执行其实并不是js的有意为之,而是一种无心插柳的行为,说是旁门左道也不为过,但它确实可以帮我们实现一些特殊的要求,所以就慢慢变成一种正经用法了。
追问
前辈你这么一提点,我真的理解不少,尤其是第一句话,他就是一个表达式。
可能我对函数形成了那种原始的思维,函数名加(),调用。
我也一直在看你给我的答案,所以说比之前还是理解了很多。谢谢前辈!
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询