声明式会致使函数提高,function会被解释器优先编译。即咱们用声明式写函数,能够在任何区域声明,不会影响咱们调用。html
function XXX(){}
函数表达式咱们常常使用,而函数表达式中的function则不会出现函数提高。而是JS解释器逐行解释,到了这一句才会解释。函数
所以若是调用在函数表达式以前,则会调用失败。spa
var k = function(){}
fn1(); function fn1(){}//能够正常调用 fn2(); var fn2 = function(){}//没法调用
如今进入正题,对函数表达式加上(),是能够直接调用的
可是若是是对声明式的后部加上()则是会被编译器忽略。.net
var fn2 = function(){}();//对,就是这样 function fn1(){}();//会被忽略
而日常的function(){}则是一种声明式,若是加上()括号后,则会被编译器认为是函数表达式,(加上+-号均可以),从而能够用()来直接调用code
(function fn1(){})();
自执行函数,即定义和调用合为一体。htm
咱们建立了一个匿名的函数,并当即执行它,因为外部没法引用它内部的变量,所以在执行完后很快就会被释放,关键是这种机制不会污染全局对象。对象
(function() { /* code */ })();
总结一下,执行函数的做用主要为 匿名 和 自动执行,代码在被解释时就已经在运行了。blog
// 下面2个括弧()都会当即执行 (function () { //我是匿名方式1----推荐使用这个----这种常常用来构建沙箱模式 } ()) (function () { //我是匿名方式2 })() // 因为括弧()和JS的&&,异或,逗号等操做符是在函数表达式和函数声明上消除歧义的 // 因此一旦解析器知道其中一个已是表达式了,其它的也都默认为表达式了 var i = function () { return 10; } (); true && function () { /* code */ } (); 0, function () { /* code */ } (); // 若是你不在乎返回值,或者不怕难以阅读 // 你甚至能够在function前面加一元操做符号 !function () { /* code */ } (); ~function () { /* code */ } (); -function () { /* code */ } (); +function () { /* code */ } (); // 还有一个状况,使用new关键字,也能够用,但我不肯定它的效率 // http://twitter.com/kuvos/status/18209252090847232 new function () { /* code */ } new function () { /* code */ } () // 若是须要传递参数,只须要加上括弧()
参考原文:ip
https://blog.csdn.net/figo333/article/details/80276302编译器
https://www.cnblogs.com/beijingstruggle/p/5970824.html
https://blog.csdn.net/sinat_17775997/article/details/80263581