(function ( ){...})( ) IIFE 的原理

你需要明白 IIFE 的原理,我简单说一下:

function foo() {...}     // 这是定义,Declaration;定义只是让解释器知道其存在,但是不会运行。foo();                   // 这是语句,Statement;解释器遇到语句是会运行它的。

IIFE 并非必须,传统一点可以这么写:

function foo() {...}
foo();

那么为什么要 IIFE?

  1. 传统的方法啰嗦,定义和执行分开写;
  2. 传统的方法直接污染全局命名空间(浏览器里的 global 对象,如 window

于是,开发者们想找一个可以解决以上问题的写法。那么像下面这么写行不行呢?

function foo(...){}();

当然是不能,但是为什么呢?因为 function foo(...){} 这个部分只是一个声明,对于解释器来说,就好像你写了一个字符串 "function foo(...){}",它需要使用解析函数,比如 eval() 来执行它才可以。所以把 () 直接放在声明后面是不会执行,这是错误的语法。

如何把它变得正确?说起来也简单,只要把 声明 变成 表达式(Expression) 就可以了。

实际上转变表达式的办法还是很多的,最常见的办法是把函数声明用一对 () 包裹起来,于是就变成了:

(function foo() {...})    // 这里是故意换行,实际上可以和下面的括号连起来
();

这就等价于:

var foo = function () {...};    // 这就不是定义,而是表达式了。
foo();

但是之前我们说不行的那个写法,其实也可以直接用括号包起来,这也是一种等价的表达式:

(function foo(){...}());

所以你问有没有区别?很简单:木有~

另外,刚才说过转变表达式的方式很多,的确还有很多别的写法,比如:

!function foo() {...}();

或者

+function foo() {...}();

这些都可以。

我个人挺偏爱用 void 来转变表达式,因为此关键字不会有返回值。不过这一点真的没有什么要紧的,就当我“龟毛”好了……

void function () {// 这里是真正需要的代码
}();

OK,所谓不去污染全局命名空间,是因为 IIFE 创建了一个新的函数作用域,你真正的业务代码被封装在其中,自然就不会触碰到全局对象了。如果你需要全局对象,那就 pass 给 IIFE:

void function (global) {// 在这里,global 就是全局对象了
}(this)    // 在浏览器里,this 就是 window 对象

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/247835.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

内部类的用法

第十章 内部类 10.1如何定义内部类 如代码10.1-1 所示 public class Parcel1 {public class Contents{private int value 0;public int getValue(){return value;}} } 这是一个很简单的内部类定义方式,你可以直接把一个类至于另一个类的内部,这种定义Contents类的方…

在vue项目中使用树形结构的穿梭框

先看一下最后的效果&#xff1a; 一个基于elementui的穿梭框组件&#xff1a;el-tree-transfer 第一步&#xff1a;安装组件 npm install el-tree-transfer --save 第二步&#xff1a;写代码 // 使用树形穿梭框组件<tree-transfer :title"title" :from_datafromDa…

导航跳转后保持选中状态 jquery高亮当前选中菜单

功能需求&#xff1a; 今天在写一个站点需要用到在导航菜单点击链接跳转到新页面后&#xff0c;高亮当前菜单样式。 简单的说&#xff0c;就是我点击导航菜单中的一个栏目&#xff0c;跳转到该栏目下&#xff0c;该栏目菜单也同时高亮&#xff08;可以是背景色也可以是背景图片…

eacharts中国地图省市区点击显示

1.安装echarts.js 相关模块 npm i echarts2. 在 main.js 文件中搭建全局 // 引入echarts import echarts from echarts Vue.prototype.$echarts echarts3.vue文件种引入相关文档 import echarts from "echarts"; import "./china.js"; // 引入中国地图…

CF2B The least round way(贪心+动规)

题目 CF2B The least round way 做法 后面\(0\)的个数&#xff0c;\(2\)和\(5\)是\(10\)分解质因数 则把方格中的每个数分解成\(2\)和\(5\)&#xff0c;对\(2\)和\(5\)求两边动规&#xff0c;得出最小值\(ansmin(num_2,num_5)\) 我们贪心地选择最小值所对应的\(2\)或\(5\)&…

JS 中的return false的作用

在大多数情况下,为事件处理函数返回false,可以防止默认的事件行为. Return False 就相当于终止符,终止默认的事件行为&#xff0c;反之,Return True 就相当于执行符,执行终止默认的事件行为。 在js中return false的作用一般是用来取消默认动作的。比如你单击一个链接除了触发你…

中英翻译(基于百度翻译)

先来看效果图 只做了简单的在线翻译&#xff0c;语音翻译和图片翻译都要钱&#xff0c;哈哈 市面上有名气的翻译公司就是有道和百度了&#xff0c;有道尝试了一下&#xff0c;分为API和SDK两种&#xff0c;但是demo下载下来跑不了 百度的就是API&#xff0c;也很简单&#xff0…

Vue中使用input简易的上传图片

<div class"boximg"><div class"topimg"><!-- <img :src"filePath" width"200px" height"170px" /> --></div><div class"botimg" click"imgClick()">上传logo<…

jQuery选择器之层级选择器

文档中的所有的节点之间都是有这样或者那样的关系。我们可以把节点之间的关系可以用传统的家族关系来描述&#xff0c;可以把文档树当作一个家谱&#xff0c;那么节点与节点直接就会存在父子&#xff0c;兄弟&#xff0c;祖孙的关系了。 选择器中的层级选择器就是用来处理这种关…

文件 图片 上传 及少许正则校验

文件 & 图片 上传 及少许正则校验 <template><div style"padding: 20px"><Row><Col span"24"><div><CFlex type"flex" justify"space-between" align"midlle"><div class"…

bootstrap-table.js如何根据单元格数据不同显示不同的字体的颜色

在bootstrap-table.js里面列属性 formatter就是用来格式化单元格的&#xff0c;其默认值是undefined 类型是function&#xff0c;function(value, row, index), value&#xff1a;该cell本来的值&#xff0c;row&#xff1a;该行数据&#xff0c;index&#xff1a;该行序号&am…

SVN_06导入项目文档

把这个项目的文档迁入到SVN Server上的库中 【1】首先右键点击projectAdmin目录&#xff0c;这时候的右键菜单例如以下图看到的&#xff1a;选择copy URL toCLipboard,就是复制统一资源定位符&#xff08;URL&#xff09;到剪贴板中 https://KJ-AP01.中国.corpnet:8443/svn/pro…

实现省市二级联动效果

实现效果&#xff1a; 代码&#xff1a; <template><div class"main_tableau"><div class"page_title">百城精算编辑</div><CFlex type"flex" justify"space-between"><div style"margin-top…

jquery操作select(取值,设置选中)

jquery操作select(增加&#xff0c;删除&#xff0c;清空) http://huapengpeng1989412.blog.163.com/blog/static/58828754201342841940720/ jQuery获取Select选择的Text和Value: 123456789$("#select_id").change(function(){//code...}); //为Select添加事件&am…

手机验证码获取

<el-form-item label"短信验证码" required><el-input v-model"ruleForm.verificationcode" placeholder"请添加验证码"><el-button v-if"isdisabled" slot"suffix" style"color:#409EFF;" type&…

关于RGB屏调试的一些知识(转)

关于RGB屏调试的一些知识转载于:https://www.cnblogs.com/LittleTiger/p/10983212.html

在bootstrap table中使用Tooltip

//偏好主题function preferenceFormatter(value, row, index) {var nameString "";if (value.length > 6) {nameString value.substring(0,6) ...;} else{nameString value;}return [<a href"#" data-toggle"tooltip" title value >…

实现值两者之间添加 , 、 | 等字符

展示效果&#xff1a; <span v-for"(item, index) in projectData.bdOwnerList" :key"index"><span style"white-space: nowrap">{{ item.userName }}<spanv-if"projectData.bdOwnerList.length - 1 ! index"style&qu…

spring-cloud搭建

1、myApplicaion 启动服务类上层必须有一层包 2、报错 com.sun.jersey.api.client.ClientHandlerException: java.net.ConnectException: Connection refused: connect 或者com.netflix.discovery.shared.transport.TransportException: Cannot execute request on any known…

JS ===和==区别

这是一种隐式类型转换 var a 12; var b 12; alert(a b);//先把两边的转换成一样的&#xff0c;再进行比较 。结果会返回true alert(a b);//不转换两边类型&#xff0c;直接比较,结果返回false