JS立即执行函数功能与用法分析


Posted in Javascript onJanuary 15, 2019

本文实例讲述了JS立即执行函数功能与用法。分享给大家供大家参考,具体如下:

相信大家经常会遇到下面这两种写法:

(function(){ ... })()

(function(){ ... }())

关于这样写是什么意思呢?有什么区别呢?

在此之前,我们需要了解几个概念:

函数声明函数表达式匿名函数

函数声明: function fnName() {...} ;

使用 function 关键字声明一个函数,再执行一个函数名,叫函数声明。

函数表达式: var fnName = function() { ... } ;

使用 function 关键字声明一个函数,但未给函数命名,最后将匿名函数赋予一个变量,叫函数表达式,这是最常见的函数表达式语法形式。

匿名函数: function() { ... } ;

使用 function 关键字声明一个函数,但未给函数命名,所以叫匿名函数,匿名函数属于函数表达式,匿名函数有很多作用,赋予一个变量则创建函数,赋予一个事件则成为事件处理程序或创建闭包等等。

函数声明和函数表达式不同之处在于

1、JavaScript 引擎在解析 JavaScript 代码时会“函数声明提升”当前执行环境(作用域)上的函数声明,而函数表达式必须等到 JavaScript 引擎执行到它所在行时,才会从上而下一行一行地解析函数表达式。

2、函数表达式后面可以加括号立即调用该函数,函数声明不可以,只能以 fnName() 形式调用。

知道了这些函数基本概念后,回头看看 (function(){ ... }()) (function() { ... })() 这两种立即执行函数的写法,最初我以为是一个括号包裹匿名函数,并在后面加个括号立即调用函数,当时不知道为什么要加括号,后来明白,要在函数体后面加括号就能立即调用,则这个函数必须是函数表达式,不能是函数声明。

(function(a) {
 console.log(a); //使用()运算符,打印出123
})(123);
(function(a) {
 console.log(a); //使用()运算符,打印出1234
}(1234));
!function(a) {
 console.log(a); //使用!运算符,打印出12345
}(12345);
+function(a) {
 console.log(a); //使用+运算符,打印出123456
}(123456);
-function(a) {
 console.log(a); //使用-运算符,打印出1234567
}(1234567);
var fn = function(a) {
 console.log(a); //使用=运算符,打印出12345678
}(12345678);

可以看到输出结果,在 function 前面加 ! 、+ 、- 甚至是逗号等都可以起到函数定以后立即执行的效果,而 () 、! 、+ 、- 、= 等运算符,都将函数声明转换成函数表达式,消除了 javascript 引擎识别函数表达式和函数声明的歧义,告诉 javascript 引擎这是一个函数表达式,不是函数声明,可以在后面加括号,并立即执行函数的代码。

加括号是最安全的做法,因为 ! 、+ 、- 等运算符还会和函数的返回值进行运算,有时造成不必要的麻烦。

不过这样的写法有什么用呢?

javascript 中没有私有作用域的概念,如果在多人开发的项目上,你在全局或局部作用域中声明了一些变量,可能会被其他人不小心用同名的变量给覆盖掉,根据 javascript 函数作用域链的特性,可以使用这种技术可以模仿一个私有作用域,用匿名函数作为一个“容器”,“容器”内部可以访问外部的变量,而外部环境不能访问“容器”内部的变量,所以 (function(){ ... })() 内部定义的变量不会和外部的变量发生冲突,俗称“匿名包裹器”或“命名空间”。

jQuery 使用的就是这种方法,将 jQuery 代码包裹在 (function(window,undefined){ ...jquery代码...})(window) 中,在全局作用域中调用 jQuery 代码时,可以达到保护 jQuery 内部变量的作用。

更多关于JavaScript相关内容可查看本站专题:《JavaScript常用函数技巧汇总》、《javascript面向对象入门教程》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》及《JavaScript数学运算用法总结》

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
javascript获取xml节点的最大值(实现代码)
Dec 11 Javascript
jquery的ajax和getJson跨域获取json数据的实现方法
Feb 04 Javascript
JavaScript学习笔记(三):JavaScript也有入口Main函数
Sep 12 Javascript
Vue Cli与BootStrap结合实现表格分页功能
Aug 18 Javascript
vue router嵌套路由在history模式下刷新无法渲染页面问题的解决方法
Jan 25 Javascript
webstorm和.vue中es6语法报错的解决方法
May 08 Javascript
浅谈AngularJS中$http服务的简单用法
May 15 Javascript
详解mpvue小程序中怎么引入iconfont字体图标
Oct 01 Javascript
angular 实现下拉列表组件的示例代码
Mar 09 Javascript
vue-test-utils初使用详解
May 23 Javascript
webpack4 从零学习常用配置(小结)
May 28 Javascript
浅析JavaScript预编译和暗示全局变量
Sep 03 Javascript
vue-cli 目录结构详细讲解总结
Jan 15 #Javascript
webpack file-loader和url-loader的区别
Jan 15 #Javascript
jQuery+vue.js实现的多选下拉列表功能示例
Jan 15 #jQuery
Element输入框带历史查询记录的实现示例
Jan 15 #Javascript
微信小程序实现多选删除列表数据功能示例
Jan 15 #Javascript
element-ui带输入建议的input框踩坑(输入建议空白以及会闪出上一次的输入建议问题)
Jan 15 #Javascript
微信小程序外卖选购页实现切换分类与数量加减功能案例
Jan 15 #Javascript
You might like
php 动态执行带有参数的类方法
2009/04/10 PHP
PHP写的加密函数,支持私人密钥(详细介绍)
2013/06/09 PHP
基于php中使用excel的简单介绍
2013/08/02 PHP
prototype Element学习笔记(篇一)
2008/10/26 Javascript
javascript radio 联动效果
2009/03/04 Javascript
用JS实现3D球状标签云示例代码
2013/12/01 Javascript
nodejs中实现sleep功能实例
2015/03/24 NodeJs
JavaScript构造函数详解
2015/12/27 Javascript
js贪吃蛇游戏实现思路和源码
2016/04/14 Javascript
js编写的treeview使用方法
2016/11/11 Javascript
jquery之基本选择器practice(实例讲解)
2017/09/30 jQuery
vue写h5页面的方法总结
2019/02/12 Javascript
微信小程序如何使用云开发
2019/05/17 Javascript
[32:07]完美世界DOTA2联赛PWL S3 LBZS vs Rebirth 第一场 12.16
2020/12/17 DOTA
Python中对列表排序实例
2015/01/04 Python
python 多线程实现检测服务器在线情况
2015/11/25 Python
python随机取list中的元素方法
2018/04/08 Python
详解从Django Rest Framework响应中删除空字段
2019/01/11 Python
详解用Python为直方图绘制拟合曲线的两种方法
2019/08/21 Python
django drf框架自带的路由及最简化的视图
2019/09/10 Python
python实现数字炸弹游戏程序
2020/07/17 Python
纯css3实现宠物小鸡实例代码
2018/10/08 HTML / CSS
迪卡侬中国官网:Decathlon中国
2020/08/10 全球购物
英国哈罗德园艺:Harrod Horticultural
2020/03/31 全球购物
SQL Server面试题
2016/10/17 面试题
小学生开学感言
2014/02/28 职场文书
人资专员岗位职责
2014/04/04 职场文书
对孩子的寄语
2014/04/09 职场文书
小学安全汇报材料
2014/08/14 职场文书
预备党员群众路线思想汇报2014
2014/10/25 职场文书
2016年“世界环境日”校园广播稿
2015/12/18 职场文书
详解用Python把PDF转为Word方法总结
2021/04/27 Python
redis哨兵常用命令和监控示例详解
2021/05/27 Redis
Redis Cluster 集群搭建你会吗
2021/08/04 Redis
vue cli4中mockjs在dev环境和build环境的配置详情
2022/04/06 Vue.js
python小型的音频操作库mp3Play
2022/04/24 Python