通常,我们声明一个函数test){},可以通过test()来调用这个函数。但是,如果我们在这个函数声明的末尾加上(),解析器是无法理解的。

function test(){console.log('hello world!');
}();//解析器是无法理解的。

那为什么将函数体部分用()包裹起来就可以了呢?

(function test(){console.log('hello world!');
})(); //输出hello world!

解释器在解释一个语句时,如果以function开头,就会理解为函数声明。而使用括号包裹定义函数体,解析器将会以函数表达式的方式去处理定义的函数,而函数表达式后面又添加了一个()就变成了一个立即执行的函数了。也就是说,任何消除函数声明和函数表达式间歧义的方法,都可以被解析器正确识别。所以,赋值,逻辑,甚至是逗号,各种操作符都可以告诉解析器,并且对函数来说使用一元运算可以算的上是消除歧义最快的方式,常见的感叹号只是其中之一。任何能将函数变成一个函数表达式的作法,都可以使解析器正确的调用定义函数。

例如:

!function () {console.log('hello world!');
}();//输出hello world

而省略了!的话:

function() {console.log('hello world!');
}();

就会理解为函数声明,而函数声明没有名字会报错。如果有函数名:

function f() {console.log('hello world!');
}();

还是会报错,因为function f(){}函数声明会提升,相当于:

function f(){console.log('hello world!');
}//其他代码...

(); // 这里报错。

ps:

如果不在乎返回值,这些一元运算都是有效的

+function(){alert('hello world!')}()        // NaN-function(){alert('hello world!')}()        // NaN~function(){alert('hello world!')}()        // -1

如有问题,欢迎留言(・∀・)

转载于:https://www.cnblogs.com/happypayne/p/7742538.html

JavaScript中的匿名函数遇上!会怎么样相关推荐

  1. javaScript中的匿名函数

    js中的匿名函数 js匿名函数 js中匿名函数的N种写法 直接上代码和截图 <!DOCTYPE html> <html> <head> <meta chars ...

  2. JavaScript中的匿名函数及函数的闭包

    1.匿名函数 函数是JavaScript中最灵活的一种对象,这里只是讲解其匿名函数的用途.匿名函数:就是没有函数名的函数. 1.1 函数的定义,首先简单介绍一下函数的定义,大致可分为三种方式 第一种: ...

  3. 【转】JavaScript中的匿名函数及函数的闭包

    对闭包理解一直不甚明了,在此特转摘博文一篇以备查用. 原文地址:http://www.cnblogs.com/rainman/archive/2009/05/04/1448899.html 相关文章: ...

  4. 对javascript中的匿名函数的理解

    (function(){//这里的所有变量和函数都属于局部对象 }()); 在javascript中以function开头的语句通常是函数声明.加上了外面的括号(黄色背景)后则创建的是函数表达式. 蓝 ...

  5. JavaScript匿名函数以及在循环中的匿名函数

    一 历史 JavaScript其实是一门奇异的语言,TA的一大特性是没有块级作用域 for(var i=0;i<10;i++){} console.log(i) 大家猜测下值是多少? 答案是 1 ...

  6. 理解与使用Javascript中的回调函数

    在Javascript中,函数是第一类对象,这意味着函数可以像对象一样按照第一类管理被使用.既然函数实际上是对象:它们能被"存储"在变量中,能作为函数参数被传递,能在函数中被创建, ...

  7. 理解javascript中的回调函数(callback)【转】

    在JavaScrip中,function是内置的类对象,也就是说它是一种类型的对象,可以和其它String.Array.Number.Object类的对象一样用于内置对象的管理.因为function实 ...

  8. 【JavaScript】理解与使用Javascript中的回调函数

    在Javascript中,函数是第一类对象,这意味着函数可以像对象一样按照第一类管理被使用.既然函数实际上是对象:它们能被"存储"在变量中,能作为函数参数被传递,能在函数中被创建, ...

  9. 什么是JavaScript中的回调函数?

    This article gives a brief introduction to the concept and usage of callback functions in the JavaSc ...

最新文章

  1. oracle循环语句loop,oracle循环语句loop
  2. 织梦html编辑器有问题怎么办,dede 织梦编辑框显示不出来的问题
  3. 强大的数据库管理工具Navicat Premium安装教程
  4. 推荐: 五分钟搞懂Xen、KVM、Qemu间的关系和区别[转载]
  5. C语言文件读写(2)-文本文件写操作
  6. SQLYog快捷键大全
  7. 给新手项目经理的12条建议
  8. USACO 1.1 Friday the Thirteenth
  9. Integer类的装箱和拆箱到底是怎样实现的?
  10. 币安跨链桥在BSC、以太坊和IoTeX主网全面支持IOTX资产
  11. 如何准确的判断一个数据的类型
  12. 妙盈科技:ESG数据提供商获融资
  13. Spring 事务模型
  14. C1见习工程师(一)
  15. php获取当前协议domain,汇总php获取根域名方法($_SERVER['SERVER_NAME']、GetUrlToDomain)...
  16. 聊一哈,新入如何优雅的跟老板打招呼
  17. oracle 与plc通信,cim系统(com系统和plc的通讯)
  18. Mac安装jekyll踩坑
  19. php的amqp扩展 安装(windows) rabbitmq学习篇
  20. React购物网站项目开发

热门文章

  1. 看完就会明白windows RT推出的原因、它和window 8到底有些什么区别、微软有什么战略企图--有关于微软Windows RT 你不知道的那些事
  2. 【opencv学习】SIFT算法的基本使用以及特征匹配
  3. Python《爬虫初实践》
  4. linux 格式化u盘_【Ventoy】一个U盘,启动多个系统
  5. matlab对文本文件的读写
  6. 【计算机视觉】opencv姿态解算6 理论算法调研 PNP问题 5种算法
  7. 用Redis存储Tomcat集群的Session
  8. 差分进化算法_基于差分进化的水泥烧成系统动态优化算法
  9. java 调用sqlite_java 调用 sqlite 数据库
  10. pwm调速流程图小车_PWM调速+循迹__智能小车程序