通常,我们声明一个函数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

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

JavaScript中的匿名函数遇上!会怎么样的更多相关文章

  1. [转]JavaScript中的匿名函数及函数的闭包

    JavaScript中的匿名函数及函数的闭包  原文地址:http://www.cnblogs.com/wl0000-03/p/6050108.html 1.匿名函数 函数是JavaScript中最灵 ...

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

    JavaScript中的匿名函数及函数的闭包  https://www.cnblogs.com/wl0000-03/p/6050108.html 1.匿名函数 函数是JavaScript中最灵活的一种 ...

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

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

  4. JavaScript 中的匿名函数((function() {})();)与变量的作用域

    以前都是直接用前端框架Bootstrap,突然想看看Javascript,发现javascript是个非常有趣的东西,这里把刚碰到的一个小问题的理解做下笔录(废话不多说,上代码). /** * Exa ...

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

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

  6. javascript中通过匿名函数进行事件绑定

  7. 在javascript中:(函数()()是一个匿名函数

    在javascript中:(函数()()是一个匿名函数,它主要使用函数中的变量范围来避免全局变量,影响整个页面环境,并提高代码兼容性. (函数())是标准函数定义,但不会复制到任何变量.所以有一个没有 ...

  8. 理解与使用Javascript中的回调函数 -2

    在javascript中回调函数非常重要,它们几乎无处不在.像其他更加传统的编程语言都有回调函数概念,但是非常奇怪的是,完完整整谈论回调函数的在线教程比较少,倒是有一堆关于call()和apply() ...

  9. 理解和使用 JavaScript 中的回调函数

    理解和使用 JavaScript 中的回调函数 标签: 回调函数指针js 2014-11-25 01:20 11506人阅读 评论(4) 收藏 举报  分类: JavaScript(4)    目录( ...

随机推荐

  1. Fabric 1.0交易流程

    这篇文章详细介绍fabric的交易流程,以图片加文字的形式呈现. Fabric 1.0交易流程 fabric中的所有交易都是通过chaincode执行 1.应用程序客户端通过SDK调用证书服务(CA) ...

  2. 手机端页面可以左右轻微拖动的bug

    在做项目的时候,必须要适应各种屏幕,移动端是必须的. 但是在移动端中,网站是左右可以动,怎么办呢? 这是只要在样式表中写入 html,body{overfow-x:hidden;} bug产生在H5的 ...

  3. 『计算机视觉』Mask-RCNN_从服装关键点检测看KeyPoints分支

    下图Github地址:Mask_RCNN       Mask_RCNN_KeyPoints『计算机视觉』Mask-RCNN_论文学习『计算机视觉』Mask-RCNN_项目文档翻译『计算机视觉』Mas ...

  4. jquery.form.js 实现异步上传

    前台: <form id="formSeacrh" action="/ResumeInfo/uploadFile" method="post&q ...

  5. 网络编程-day1

    一. *** C/S架构:客户端(client)/服务端(server)架构, B/S架构:浏览器(browser) / 服务端(server)架构 软件cs架构:浏览器,qq,微信,陌陌等等 硬件c ...

  6. python全栈开发笔记----基本数据类型---列表方法

    #list 类中提供的方法 #参数 1.def append(self, *args, **kwargs)原来值最后追加#对象..方法(..) #li对象调用append方法 li = [11,22, ...

  7. [Spring Boot]什么是Spring Boot

    <Spring Boot是什么> Spring Boot不是一个框架 是一种用来轻松创建具有最小或零配置的独立应用程序的方式 用来开发基于Spring的应用,但只需非常少的配置. 它提供了 ...

  8. C# 异步通信 网络聊天程序开发 局域网聊天室开发

    Prepare 本文将使用一个NuGet公开的组件技术来实现一个局域网聊天程序,利用组件提供的高性能异步网络机制实现,免去了手动编写底层的困扰,易于二次开发,扩展自己的功能. 在Visual Stud ...

  9. C# 读写西门子PLC数据,包含S7协议和Fetch/Write协议,s7支持200smart,300PLC,1200PLC,1500PLC

    本文将使用一个gitHub开源的组件技术来读写西门子plc数据,使用的是基于以太网的TCP/IP实现,不需要额外的组件,读取操作只要放到后台线程就不会卡死线程,本组件支持超级方便的高性能读写操作 官方 ...

  10. Reactor

    Flux和Mono Flux和Mono是Reactor中的两个基本概念.Flux表示的是包含0到N个元素的异步序列.在该序列中可以包含三种不同类型的消息通知:正常的包含元素的消息,序列结束的消息和序列 ...