JS 的立即执行函数
JS 的立即执行函数
本文写于 2019 年 12 月 7 日
其实 ES6 之后有了之后,很多之前的用法都没必要了,立即执行函数就是其一。
今天看到一道面试题:
请「用自己的语言」简述
- 立即执行函数是什么
- 立即执行函数有什么用途
我愣了一下,突然发现自己不是很能清晰的解答这个概念。
我只知道()代表了两种作用:
- 包裹
- 执行函数
立即执行函数该怎么描述呢?
声明一个匿名函数,然后马上调用这个匿名函数,就是立即执行函数?
的确,这就是一个典型的立即执行函数。
首先声明一个匿名函数: function(){ alert(‘我是匿名函数’) }
然后在匿名函数后面接一对括号 (),调用这个匿名函数。
那么为什么还要用另一对括号把匿名函数包起来呢?
其实是为了兼容 JS 的语法。
如果我们不加另一对括号,直接写成:
function(){
alert('我是匿名函数')
}()
浏览器会报语法错误!
想要通过浏览器的语法检查,必须加点小东西,比如下面几种
;(function () {
alert('我是匿名函数')
})()(
// 用括号把整个表达式包起来
function () {
alert('我是匿名函数')
}
)() //用括号把函数包起来
!(function () {
alert('我是匿名函数')
})() + // 求反,我们不在意值是多少,只想通过语法检查。
(function () {
alert('我是匿名函数')
})() -
(function () {
alert('我是匿名函数')
})()
~(function () {
alert('我是匿名函数')
})()
void (function () {
alert('我是匿名函数')
})()
new (function () {
alert('我是匿名函数')
})()
目前我也不是很清楚为什么,但是这些都是实验证明不会报错的写法。(所以大家都说 JS 诡异)
立即执行函数有什么用呢?
只有一个作用:创建一个独立的作用域。
这个作用域里面的变量,外面访问不到(即避免「变量污染」)。
var liList = ul.getElementsByTagName('li')
for (var i = 0; i < 6; i++) {
liList[i].onclick = function () {
alert(i) // 为什么 alert 出来的总是 6,而不是 0、1、2、3、4、5
}
}
为什么 alert 的总是 6 呢,因为 i 是贯穿整个作用域的,而不是给每个 li 分配了一个 i!
怎么解决这个问题呢?
用立即执行函数给每个 li 创造一个独立作用域即可:
var liList = ul.getElementsByTagName('li')
for (var i = 0; i < 6; i++) {
!(function (ii) {
liList[ii].onclick = function () {
alert(ii) // 0、1、2、3、4、5
}
})(i)
}
在立即执行函数执行的时候,i 的值被赋值给 ii,此后 ii 的值一直不变。
i 的值从 0 变化到 5,对应 6 个立即执行函数,这 6 个立即执行函数里面的 ii 「分别」是 0、1、2、3、4、5。
但是这是用var声明,如果使用了let,不会出现这种问题!!!!!!
这就是立即执行函数的基本概念。
(完)
JS 的立即执行函数的更多相关文章
- js匿名自执行函数中闭包的高级使用(---------------------------******-----------------------------)
先看看最常见的一个问题: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> ...
- JS中立即执行函数的理解
1.匿名函数不能单独定义,必须进行赋值操作或者立即执行,否则会被JS引擎定义为语法错误 function(){alert(dada);} VM229:1 Uncaught SyntaxError: U ...
- js中立即执行函数写法理解
在理解了一些函数基本概念后,回头看看( function(){…} )()和( function (){…} () )这两种立即执行函数的写法,最初我以为是一个括号包裹匿名函数, 并后面加个括号立即调 ...
- js匿名自执行函数
匿名自执行函数:没有方法名的函数闭包:闭包是指有权访问另一个函数作用域变量的函数: 通过一个实例来解释: 从网上找到了一个案例,使用了for循环.匿名自执行函数.setTimeout. 案例1: va ...
- js的立即执行函数
立即执行函数:常用于第三方库,好处在于隔离作用域,任何一个第三方库都会存在大量的变量和函数,为了避免变量污染(命名冲突),一般想到的方法就是使用立即执行函数.jQuery就是使用的立即执行函数. 函数 ...
- 【原】js离开页面执行函数 onbeforeunload与onunload事件
在最近的项目中,需要做到一个时间,就是用户离开页面的时候,我需要缓存页面其中一部分的内容,但是我不需要用户刷新的时候也缓存,我只希望在我用户离开的时候 执行这个函数.百度之,有onbeforeunlo ...
- js中自执行函数(function(){})()和(function(){}())区别
方式一,调用函数,得到返回值.强制函数直接量执行再返回一个引用,引用在去调用执行方式二,调用函数,得到返回值.强制运算符使函数调用执行(function(){})(); 是 把函数当作表达式解析,然后 ...
- js自定义延迟执行函数
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...
- js中自执行函数写法
//自执行写法1 (function T(){ alert(1) })() //自执行写法2 var T1=function(){ alert(1) }(); //传值 var para1={a:1; ...
随机推荐
- jdk代理和cglib代理源代码之我见
以前值是读过一遍jdk和cglib的代理,时间长了,都忘记入口在哪里了,值是记得其中的一些重点了,今天写一篇博客,当作是笔记.和以前一样,关键代码,我会用红色标记出来. 首先,先列出我的jdk代理对象 ...
- 图灵机器人 V1 和 V2 接入方法
API1.0使用方法: import requests import json import yuyinhecheng as hc def Tuling(words): Tuling_API_ ...
- Effective Java —— 多字段下考虑使用建造者模式构建实例
本文参考 本篇文章参考自<Effective Java>第三版第二条"Consider a builder when faced with many constructor pa ...
- fsdfd
static int kWeiOfVal(int val, int k) { int n = 1; int temVal = val; int result; while (1) { temVal = ...
- 排序 | 冒泡排序的优化与qsort快速排序
冒泡排序 冒泡排序 Bubble_Sort,是极为简单的一种排序算法.虽然效率差一点,但好在具有结构简单,容易理解,易于操作等优点.冒泡排序就是把小的元素往前调或者把大的元素往后调.在相邻的两个元素间 ...
- 破解浏览器同源政策利器之JSONP
本文是在了解了浏览器的同源规则之后,学习了破解这个规则的一个简单有效的方法->JSONP.主要通过阮一峰老师的博客学习 浏览器的同源规则 有这样一个背景,如果你通过银行的网站进行的取钱的交易,而 ...
- 设计一个基于svg的涂鸦组件(一)
基于svg写了一个涂鸦组件,说项目之前先附上几张效果图: 项目地址:SVGraffiti 由于篇幅问题,本文先总体介绍一下项目的大概情况,重点介绍一下组件间的通信方式. 一.项目说明 该项目是基于we ...
- Exchange 2013 中 NDR 常见的失败返回状态代码
增强状态代码 描述 可能的原因 其他信息 4.3.1 Insufficient system resources 发生内存不足错误.资源问题(例如磁盘已满)可能导致该问题.您可能会收到内存不足错误,而 ...
- signed integer overflow整数溢出
整数越界情况 1. 数组下标越界, 大于N或者小于0 2. 数字过大,可以选择取个模,或者换long long, double 我笑了 还有一个暂时没有好的解决方法的:string s:cin/输入 ...
- go interface{}使用
先上代码 func In(haystack []interface{}, needle interface{}) (bool, error) { sVal := reflect.ValueOf(hay ...