美文网首页
闭包原理及应用

闭包原理及应用

作者: Cinderella歌儿 | 来源:发表于2016-12-30 16:38 被阅读0次

这个问题的经典性,几乎所有面试官都会问到这个问题,什么情况下会发生闭包,为什么需要闭包,什么场景下需要,闭包闭了谁,怎么释放被闭包的变量内存,闭包的优点是什么,缺点是什么等等。

http://www.cnblogs.com/xxcanghai/p/4991870.html

JS中有几种函数
具名函数 (命名函数)和匿名函数。

创建函数的几种方式
1.声明函数
2.创建匿名函数表达式
3.创建具名函数表达式
4.Function构造函数(可以得到想要的结果,类似eval)

var str='2+5+8';
alert(new Function('return '+str)());

返回的结果是15。

5.自执行函数

(function(){alert(1);})();
(function fn1(){alert(1);})();

6.其他创建函数的方法
当然还有其他创建函数或执行函数的方法,这里不再多说,比如采用 eval , setTimeout , setInterval 等非常用方法,这里不做过多介绍,属于非标准方法,这里不做过多展开。

注意:所有声明的匿名函数都是一个新函数
所有new出来的函数也都是一个新的函数

函数作用域链
作用域:就是变量和函数的可访问范围,控制着变量和函数的可见性与生命周期,在JavaScript中变量的作用域有全局作用域和局部作用域。

var a=3; //全局变量 
function fn(b){ //局部变量
     c=2; //全局变量 
     var d=5; //局部变量
     function subFn(){ 
        var e=d; //父函数的局部变量对子函数可见
        for(var i=0;i<3;i++){
             console.write(i);
       } 
      alert(i);//3, 在for循环内声明,循环外function内仍然可见,没有块作用域
     }
 }
 alert(c); //在function内声明但不带var修饰,仍然是全局变量

预解析
JavaScript虽然是解释执行,但也不是按部就班逐句解释执行的,在真正解释执行之前,JavaScript解释器会预解析代码,将变量、函数声明部分提前解释,这就意味着我们可以在function声明语句之前调用function。

console.log(a); //undefined 
var a=3; 
console.log(a); //3
console.log(b); //Uncaught ReferenceError: b is not defined

执行环境
定义了变量或函数有权访问的其它数据,决定了它们的各自行为。
全局执行环境是最外层的一个执行环境,在web浏览器中全局执行环境是window对象,因此所有全局变量和函数都是作为window对象的属性和放大创建的。每个函数都有自己的执行环境,当执行流进入一个函数的时候,函数的环境会被推入一个函数栈中,而在函数执行完毕后执行环境出栈并被销毁,保存在其中的所有变量和函数定义随之销毁,控制权返回到之前的执行环境中,全局的执行环境在应用程序退出(浏览器关闭)才会被销毁。

作用域链:JavaScript里一切都是对象。函数对象和其它对象一样,拥有可以通过代码访问的属性和一系列仅供JavaScript引擎访问的内部属性。其中一个内部属性是[[Scope]],由ECMA-262标准第三版定义,该内部属性包含了函数被创建的作用域中对象的集合,这个集合被称为函数的作用域链,它决定了哪些数据能被函数访问。

在函数运行过程中标识符的解析是沿着作用域链一级一级搜索的过程,从第一个对象开始,逐级向后回溯,直到找到同名标识符为止,找到后不再继续遍历,找不到就报错。

闭包:广义上的闭包就是指一个变量在他自身作用域外被使用了,就叫发生了闭包。(父级函数的局部变量对子级可见,可以被子级调用)

经典问题,一目了然:

for(var i=0;i<elements.length;i++){ 
   elements[i].onclick=function(){
        alert(i);
  } 
}
25155228-20e402b0be0e477da99354b50c119018.png

闭包不能滥用:
闭包会使子函数保持其作用域链的所有变量及函数与内存中,内存消耗很大,在使用的时候尽量销毁父函数不再使用的变量。

相关文章

  • 闭包原理及应用

    这个问题的经典性,几乎所有面试官都会问到这个问题,什么情况下会发生闭包,为什么需要闭包,什么场景下需要,闭包闭了谁...

  • 《你不知道的JavaScript》之作用域闭包

    闭包 说到作用域闭包,我想很多同学都知道,但是让你讲讲其原理以及应用场景,也许又不知从何说起。 其实作用域闭包无处...

  • 闭包(closure)

    ● 闭包基础 ● 闭包作用 ● 闭包经典例子 ● 闭包应用 ● 闭包缺点 ● 参考资料 1、闭包基础 作用域和作...

  • iOS开发之Swift篇(7)—— 闭包

    目录 版本 闭包的定义及使用 尾随闭包 逃逸闭包 版本 Xcode 11.0Swift 5.1 闭包的定义及使用 ...

  • Swift-08:闭包

    1.分析闭包以及闭包捕获变量的原理2.逃逸闭包 & 非逃逸闭包 一、闭包 闭包是一个捕获了全局上下文的常量或者变量...

  • JavaScript中闭包的概念、原理、作用及应用

    一、闭包概念 闭包:有权访问另一个函数作用域中的变量的函数;一般情况就是在一个函数中包含另一个函数。从官方定义我们...

  • 闭包1(基础)

    (什么是闭包?闭包的作用?闭包的缺陷?) (闭包的几种可能的应用场景) (闭包与内存泄漏,有关闭包的面试题) 推荐...

  • 前端必背知识点

    什么是闭包,为什么要用闭包,闭包会产生哪些影响。 原型。 继承 原生Ajax(必会),jsonp的原理,jsonp...

  • Swift-进阶 :闭包(一)使用&捕获原理

    本文主要分析闭包以及闭包捕获变量的原理 闭包 闭包是一个捕获了全局上下文的常量或者变量的函数,通俗来讲,闭包可以是...

  • 闭包原理

    忠于兴趣,诚待文字,取悦自己,理解他人。 变量 作用域 作用域链 闭包 0-1javascript变量 1Java...

网友评论

      本文标题:闭包原理及应用

      本文链接:https://www.haomeiwen.com/subject/ghopvttx.html