function前加运算符实现立即执行函数

我们知道函数的调用方式通常是FunctionName()

但如果我们尝试为一个“定义函数”末尾加上(),解析器是无法理解的。

function msg(){
  alert('message');
}();//解析器是无法理解的

定义函数的调用方式应该是 msg()。

想让函数立即执行可以将函数体部分用()包裹起来。

这是因为,使用括号包裹定义函数体,解析器将会以函数表达式的方式去调用定义函数。也就是说,任何能将函数变成一个函数表达式的作法,都可以使解析器正确的调用定义函数。如下:

// 这么写会报错,因为这是一个函数定义:
function() {}()

// 常见的(多了一对括号),调用匿名函数:
(function() {})()

// 但在前面加上一个布尔运算符(只多了一个感叹号),就是表达式了,将执行后面的代码,也就合法实现调用
!function() {}()

! 只是其中一个运算符,而 + - || ~都有这样的功能。

用 ! 可能更多的是一个习惯问题,不同的运算符,性能是不同的。

效果等同于以下常用的两种立即执行方式:

(function() {})();  
// or  
(function() {}()); 

谢谢大家的阅读。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏noteless

-1-2 java 面向对象基本概念 封装继承多态 变量 this super static 静态变量 匿名对象 值传递 初始化过程 代码块 final关键字 抽象类 接口 区别 多态

面向对象把功能逻辑封装到类本身,用对象去调用功能 持有数据,结构更加自然,也更符合人们的思维习惯

731
来自专栏十月梦想

each()list()while遍历数组

each()函数:需要一个数组作为参考,each函数返回1,0,key,value键值,0,key返回键,1,value对应的值,

821
来自专栏Hongten

java中静态变量和实例变量到底有什么区别_看了就知道啦

==================================================

633
来自专栏程序员互动联盟

【编程基础】C语言指针的初始化和赋值

1、指针的初始化 指针初始化时,“=”的右操作数必须为内存中数据的地址,不可以是变量,也不可以直接用整型地址值(但是int*p=0;除外,该语句表示指针为空)。...

3768
来自专栏苍云横渡学习笔记

【JavaSE(二)】Java语法基础(下)

18410
来自专栏抠抠空间

re模块(正则表达式)

一、什么是正则表达式 正则就是用一些具有特殊含义的符号组合到一起(称为正则表达式)来描述字符或者字符串的方法。或者说:正则就是用来描述一类事物的规则。(在Pyt...

3006
来自专栏java初学

static关键字

28210
来自专栏程序员互动联盟

【java基础】匿名类

昨天后台的一个小伙伴提到了,java里面的匿名类,这个概念在平常java码代码的时候用的特别多,所以找了一篇介绍表述比较清晰的文章分享给大家,能极大的简化代码量...

3537
来自专栏土豆专栏

Java面试之关键字

finalize()是Object的protected方法,子类可以覆盖该方法来实现资源清理工作,GC在回收对象之前调用该方法。

18910
来自专栏Linux驱动

指针学习(详解)

在指针中*是取内容,&是取地址 (在结构体中时:变量结构体用".",指针结构体用"->") 通常有两种的表示: 1. 通过指针向指向的地址内容赋值 *p=a;...

1635

扫码关注云+社区