前端面试之立即执行函数

什么是立即执行函数

声明一个函数,并马上调用这个匿名函数就叫做立即执行函数。在定义好一个函数后,直接执行。

(function() {alert('立即执行函数')})() 

用声明一个函数,用括号包起来,调用此函数。

立即执行函数的写法

有时候,我们定义函数以后,立即调用该函数,这时不能在函数的定义后面直接加圆括号,这会产生语法错误。产生语法错误的原因是,function这个关键字,既可以当做语句,也可以当做表达式。

//语句
function fn() {};

//表达式
var fn = function(){};

规定:如果function出现在行首,一律解析成语句。行首是function关键字时,这一段都是函数定义,不应该以圆括号结尾,所以会报错。当不让function出现在行首时,这将被理解为一个表达式,最简单的处理方式就是将其放在一个圆括号里。

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

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

以圆括号开头,这将被理解为表达式,而不是一个函数定义语句,所以就避免了错误,这就叫“立即执行函数”。
其他的写法:

(function() {alert('匿名函数')}())  //用括号将整个表达式包起来
(function() {alert('匿名函数')})()  //用括号将函数包起来
!function() {alert('匿名函数')}()
+function() {alert('匿名函数')}()
-function() {alert('匿名函数')}()
~function() {alert('匿名函数')}()
void function() {alert('匿名函数')}()
new function() {alert('匿名函数')}()

立即执行函数的作用

1、不必为函数命名,避免了污染全局变量。

2、立即执行函数内部形成了一个单独的作用域,可以封装一些外部无法读取的私有变量。

3、封装变量。

面试题

var list = document.getElementById("list");
var li = list.children;
for(var i = 0 ;i<li.length;i++){
  li[i].onclick=function(){
    alert(i);  // 结果总是3.而不是0,1,2
    }
}

因为i是贯穿整个作用域的,而不是给每一个li分配一个i,点击事件使异步用户一定是在for运行完以后才点击,此时i已经变成3了。

解决方法:

1、使用立即执行函数,给每个li创建一个独立的作用域,在立即执行函数执行的时候,i的值从0到2,对应三个立即执行函数,所以就能正常输出了。

var list = document.getElementById("list");
    var li = list.children;
    for(var i = 0 ;i<li.length;i++){
      (function(j) {li[j].onclick=function(){
        alert(j);  // 结果是0,1,2
      }})(i)
    }

2、使用ES6的块级作用域

var list = document.getElementById("list");
var li = list.children;
for(let i = 0 ;i<li.length;i++){
  li[i].onclick=function(){
    alert(i);  // 结果总是3.而不是0,1,2
    }
}

立即执行函数的使用场景

1、代码在页面加载完成之后,不得不执行一些设置工作,比如时间处理器,创建对象等等。

2、所有的这些动作只需要执行一次,比如只需要显示一个事件。

3、将代码包裹在它的局部作用域中,不会让任何变量泄漏成全局变量。

立即执行函数的参数

(function(i) {
    ...
})(j)

如果立即执行函数中需要全局变量,全局变量会被作为一个参数传递给立即执行函数。j代表是实参,i代表的是执行函数的形参。

立即执行函数的作用

1、改变变量的作用域(创建一个独立的作用域)。

2、封装临时变量。

原文地址:https://www.cnblogs.com/bzsheng/p/12083115.html

时间: 2024-08-29 19:10:48

前端面试之立即执行函数的相关文章

问得最多的十个JavaScript前端面试问题

我知道有很多人不同意这种类型的面试.其实不管你喜不喜欢,你都得接受.尤其当你是自学的,而且要申请第一份工作时. 我估计很多有人其它方法来证明他自己,像Github/ 项目地址可能是非常理想的证明方法,但也别全都指望这些. 好消息是有一些很难的问题,在有限的时间里我没答上来(比如说Event Loop和杨辉三角),一些其它面试侯选人也承认他们也没答上来,这会让讨论变得轻松很多. 坏消息是有些面试之后就没有任何反馈了.有三家公司再也没联系过.这点击打击自信,而且没有受到尊重.然后你可能会有心理斗争,

2016.10.19 小米前端面试 vs 2016.10.22 华为web面试

这次面试还是很值得记录一下的~长了很多姿势. 一共三面,面试官都是MIUI的浏览器部门,感觉面试官都很厉害,知识点问的很细很深入. 一面面试官是个可爱的小姑娘,主要考察的就是常见的前端面试题,很基础,但是会在其上进行拓展和深入.就我记得的一些题做个总结: 1. 说一下CSS的盒模型?(这简直是我参加过的几乎所有前端面试岗必问的一道题目--不管是比较水的国企还是问基础的互联网... 想一想似乎只有只问项目不谈基础的京东没有问吧) 这里是答案 2. 常用的跨域方法:(之前小米一个面试官电话面试时候也

【转载】前端面试“http全过程”将所有HTTP相关知识抛出来了...

原文:前端面试“http全过程”将所有HTTP相关知识抛出来了... 来一篇串通,一个http全过程的问题,把所有HTTP相关知识点都带过一遍 http全过程 输入域名(url)-->DNS映射为IP-->TCP三次握手-->HTTP请求-->HTTP响应-->(浏览器跟踪重定向地址)-->服务器处理请求-->服务器返回一个html响应-->(视情况决定释放TCP连接)-->客户端解析HTML-->获取嵌入在HTML中的对象重新发起http请求

前端面试的面试经验

?? 文章列表 前端面试总结--基础javascript篇 前端面试总结--进阶javascript篇 前端面试总结--http.html和浏览器篇 前端面试总结--css篇 一.基础javascript篇 1. get请求传参长度的误区 误区:我们经常说get请求参数的大小存在限制,而post请求的参数大小是无限制的. 实际上HTTP 协议从未规定 GET/POST 的请求长度限制是多少.对get请求参数的限制是来源与浏览器或web服务器,浏览器或web服务器限制了url的长度.为了明确这个概

前端面试押题整理

HTML 押题 1 (必考) 你是如何理解 HTML 语义化的? 2 第一种举例,段落用 p,边栏用 aside,主要内容用 main 标签 3 第二种 最开始是 PHP 后端写 HTML,不会 CSS,于是就用 table 来布局.table 使用展示表格的.严重违反了 HTML 语义化. 4 后来有了专门的写 CSS 的前端,他们会使用 DIV + CSS 布局,主要是用 float 和绝对定位布局.稍微符合了 HTML 语义化. 5 再后来,前端专业化,知道 HTML 的各个标签的用法,于

前端面试所遇到的技术点

前端面试所遇到的技术点: 面试问题: HTML: 常见的HTML标签: (1)行标签和块级标签分别有哪些? (2)常见的HTML5的标签有哪些? (3)如何减少HTTP的请求和优化? 减少请求的资源方法: 将多个css资源文件打包到一个文件里.将多个js打包到一个js文件里.针对图片资源:可采用雪碧图将多个图片放置到一个图片里. 尽量的压缩css文件,js文件,图片文件,采用无损压缩的方式或者是使用webP格式的图片. (4)html5和HTML4的区别 html5可以自定义标签,并兼容html

前端面试送命题

前言 前面说过很多前端面试的考题或技巧,这次来总结一下前端面试者常犯的一些错误. void立即执行函数 常见写法如下 (function () { // code })(); 解析器会将其解析如下 var a = 1 (function () { // Uncaught TypeError: 1 is not a function })() 如今我们可以这样处理 void function () { // code }(); null 即为对象 typeof null === "object&q

前端面试绝对会考的JS问题!【已经开源】

写在前面 [前端指南]前端面试库已经开源,正在完善之中 [x] css问题 [x] html问题 [x] javascript问题 github地址 https://github.com/nanhupatar... JavaScript 的组成 JavaScript 由以下三部分组成: ECMAScript(核心):JavaScript 语言基础 DOM(文档对象模型):规定了访问 HTML 和 XML 的接口 BOM(浏览器对象模型):提供了浏览器窗口之间进行交互的对象和方法 JS 的基本数据

2018年前端面试总结

2018年前端面试总结 再有两个月,2018就快过完了,因而有必要在年末对2018年的前端学习做一个总结,本文主要从前端面试中的一些基础知识来对前端进行相关的总结.本文根据网络面试题进行总结. 基础知识 本部分主要从以下几个方面来回顾前端相关的基础知识: HTML相关 CSS相关 JAVASCRIPT相关 DOM相关 HTTP相关 webpack相关 Html html 根据内容的结构化(内容语义化),选择合适的标签(代码语义化)便于开发者阅读和写出更优雅的代码的同时让浏览器的爬虫和机器很好地解