javaScript面试题整理 --- 什么是闭包,什么是立即执行函数,它的作用是什么?简单说一下闭包的使用场景

news/2024/7/2 21:28:09

什么是闭包,简单说一下闭包的使用场景

 

要理解闭包,首先必须理解Javascript特殊的变量作用域

变量的作用域无非就是两种:全局变量局部变量

Javascript语言的特殊之处:

 1、函数内部可以直接读取全局变量。

 2、在函数外部自然无法读取函数内的局部变量。

3、函数内部声明变量的时候,一定要使用var命令。如果不用的话,你实际上声明了一个全局变量!

 

出于种种原因,我们有时候需要得到函数内的局部变量。但是,前面已经说过了,正常情况下,这是办不到的,只有通过变通方法才能实现。

那就是在函数的内部,再定义一个函数。

 function f1(){

    var n=999;

    function f2(){
      alert(n); // 999
    }

  }

在上面的代码中,函数f2就被包括在函数f1内部,这时f1内部的所有局部变量,对f2都是可见的。但是反过来就不行,f2内部的局部变量,对f1就是不可见的。这就是Javascript语言特有的"链式作用域"结构(chain scope),子对象会一级一级地向上寻找所有父对象的变量。所以,父对象的所有变量,对子对象都是可见的,反之则不成立。

既然f2可以读取f1中的局部变量,那么只要把f2作为返回值,我们不就可以在f1外部读取它的内部变量了吗

 function f1(){

    var n=999;

    function f2(){
      alert(n);
    }

    return f2;

  }

  var result=f1();

  result(); // 999

上一节代码中的f2函数,就是闭包。

由于在Javascript语言中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成"定义在一个函数内部的函数"。

所以,在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁。

 

闭包的使用场景:

1.setTimeout 

原生的setTimeout传递的第一个函数不能带参数,通过闭包可以实现传参效果。

2、回调  

定义行为,然后把它关联到某个用户事件上(点击或者按键)。代码通常会作为一个回调(事件触发时调用的函数)绑定到事件。

3、函数防抖

在事件被触发n秒后再执行回调,如果在这n秒内又被触发,则重新计时。实现的关键就在于setTimeOut这个函数,由于还需要一个变量来保存计时,考虑维护全局纯净,可以借助闭包来实现。

4.封装私有变量

 

什么是立即执行函数?

声明一个函数,并马上调用这个匿名函数就叫做立即执行函数;也可以说立即执行函数是一种语法,让你的函数在定义以后立即执行;

(function(){
//code
}())

(function (){
//code
})()

它的作用是什么

  1. 不必为函数命名,避免了污染全局变量
  2. 立即执行函数内部形成了一个单独的作用域,可以封装一些外部无法读取的私有变量
  3. 封装变量

立即执行函数会形成一个单独的作用域,我们可以封装一些临时变量或者局部变量,避免污染全局变量


http://www.niftyadmin.cn/n/3655839.html

相关文章

JavaScript----- 链表学习

1、数组的缺点 在其他语言中 数组的长度是固定的,所以数组被填满后在添加新的元素是非常困难的。在数组中添加和删除也是很麻烦的,需要把其他元素向前或者向后平移,以反映数组刚刚进行了添加或删除操作。 在JavaScript 中数组的主要问题是&a…

JavaScript ---- 字典学习

字典是一种以键-值对形式存储数据的数据结构 JavaScript的object类就是以字典的形式设计的, function Dictionary() {this.add add;this.datastore new Array();this.find find;this.remove removethis.showAll showAllthis.count countthis.clear clear}f…

VS2005 IDE的bug?

在修改医疗程序的时候,遇到这样的一个问题,原来的程序是VS2003开发的VB.net程序,目前我转移到VS2005来,发现有些窗体界面无法打开,报出如下错误:(注,以前记得打开成功过几次&#xf…

JavaScript------散列学习

散列是一种常用的数据存储技术,散列后的数据可以快速的插入或取用。 散列使用的数据结构叫做 散列表。 在散列表上插入、删除和取用数据都非常的快,但是对于查找操作来说却效率低下,比如查找一组数据中的最大值和最小值。这些操作得求助于其…

.Net Mirco Framework 2007技术大会

.Net Mirco Framework 2007技术大会2006年在《程序员》杂志上通过看马宁的专栏文章,第一次知道了.Net MF。一年后的今天终于近距离地接触了.Net Mirco Frmaework,对MF有了一定的感性认识。最近公司很多项目都有大量嵌入式设备使用,由于WinCE系…

JavaScript ---- 集合学习

集合(set)是一种包含不同元素的数据结构。集合中的元素称为成员。集合的两个最重 要特性是: 1、集合中的成员是无序的 2、集合中不允许相同成员存在 1 集合的定义、操作和属性 1.1 集合的定义 不包含任何成员的集合称为空集,全集则是包含一切可能成员的…

火车站信息服务系统之LED大屏显示

最近比较忙,有一段时间没有更新blog了。一是忙隧道广告通信系统升级工作(两个方案同时做,linux和wince方案),二是忙北京南站的信息服务系统,由于该项目我们介入的比较晚,主要是参与型厂商&#…

2020-12-06 instanceof 的原理,并代码实现

解答 : 遍历A的原型链,如果能找到B的prototype,返回true 找不到返回false const instanceOf (A, B) > {let p A;while (p) {if (p B.prototype) {return true}p p.__proto__;}return false }