闭包理解

闭包

刚学过的闭包,分享一下闭包的理解
1.什么是闭包?
闭包就是一个函数,也可以说闭包是一个引用关系,可以理解为一个作用域可以访问另一个函数的局部变量。
代码:

function fn() {
var num = 10;
function fun() {
console.log(num);
}
fun();
}
fn();

函数调用后,运行结果为10;
可以理解为 fun函数内部作用域访问到了fn函数内部的私有变量num,fn函数调用后,访问到了内部的局部变量。
这就引出了闭包产生的条件。
2.闭包的产生条件?
a.函数的嵌套;
b.内部函数 引用外部函数的局部变量;
c.调用外部函数;
3.闭包的作用
a. 延长外部函数变量对象的生命周期(也可以认为延伸了变量的作用范围);
b. 让函数外部可以操作(读写)到函数内部的数据(变量/函数),通过闭包间接的操作;
c.注意: 浏览器为了性能后期将外部函数中不被内部函数使用的变量清除了;
一段代码当中 究竟存在几套闭包机制 取决于外部函数调用了几次

代码块一

  function fn() {
      var a = 0;
      function fn1() {
          a  ;
          console.log(a)
      }
      return fn1;
    }
     var f = fn();
    f();
    f();
    f();

解析:因为fn函数只调用了一次,创建了一次执行环境,后续的执行全在这一次创建的执行环境里,所以a ,也在原有的基础上增加。
**所以输出结果为 1,2,3;**闭包机制只有一套
代码块二

    function fn() {
      var a = 0;
      function fn1() {
          a  ;
          console.log(a)
      }
      return fn1;
      }
   fn();
   fn();
   fn();

解析:fn函数被调用了三次,每调用一次,就 创建一次新的执行环境,执行完成好进行销毁,所以每次调用a就从0开始 ,所以输出结果为1,1,1;闭包机制有三套
3.常见的闭包
a. 将函数作为另一个函数的返回值;
b. 将函数作为实参传递给另一个函数调用;
c. 使用闭包实现私有方法操作独立的私有属性;

看如下代码

functionc fn(){
          var num =10;
          function fun(){
          console.log(num);
         }
         return fun;
}
var f = fn();
console.log(f);
console.log(f());

将函数作为另一个函数的返回值;
解析

var f =fn();
fn();//fn 运行 返回值是fun函数
var f =function fun(){
   console.log(num);
}

所以console.log(f)打印出来的是 10
因为 fun函数没有返回值,先运行一遍fun函数,再打印出fun函数的返回值;所以console.log(f());打印出来的值是 10,undefined

4.闭包的生命周期

1. 产生: 在嵌套内部函数定义完时就产生了(不是在调用),外部函数调用的时候;
2. 死亡: 在嵌套的内部函数成为垃圾对象时;

5.闭包的缺点和解决(内存泄漏和内存溢出)

  1. 内存泄漏 : 内存无法释放;
    
  2. 内存溢出 : 内存被撑爆;
    
  3. f = null;  解决方式;让闭包机制清除,必须删除外部函数调用的时候生成的(定义的那个对应内部函数);
    

6.闭包面试题
代码段1

var name = "The Window";
var object = {
name: "My Object",
getNameFunc: function() {

return function() {
return this.name;
};
}
};
console.log(object.getNameFunc()());

解析

//解析
var f = object.getNameFunc();
var f = function() {
return this.name;
}
f();

function() {
return this.name;
}(); //相当于立即执行函数 this指向的是window

此题没有用到闭包
所以输出结果为 The Window
代码段2

var name2 = "The Window";
var object2 = {
   name2: "My Object",
   getNameFunc: function () {
       var that = this;
       return function () {
           return that.name2;
       };
   }
};
console.log(object2.getNameFunc()());

解析
典型的一个作用域可以访问另一个函数的局部变量。是闭包
var that =this;
这个this指的调用者object2对象,所以that也是object2对象,所以that.name2指的是object2的name属性。输出结果为 My Object

来源:https://www.icode9.com/content-4-888501.html

(0)

相关推荐

  • 前端面试题之JavaScript

    ES6语法有哪些,分别怎么用 参考链接:http://es6.ruanyifeng.com/ new的执行过程 创建一个空对象: 将构造函数的 prototype 属性赋值给新对象的 __proto_ ...

  • JavaScript中的函数

    概念 函数就是封装了一段可被重复调用执行的代码块. 函数的使用分为两步:声明函数和调用函数. 函数声明 function fn() { console.log("hi") } 注意 ...

  • JavaScript this 关键字详解

    一.前言 this关键字是JavaScript中最复杂的机制之一.它是一个很特别的关键字,被自动定义在所有函数的作用域中.对于那些没有投入时间学习this机制的JavaScript开发者来说,this ...

  • 「学习笔记」JavaScript基础

    前言 最近一直在跟着黑马教程学习JavaScript内容,遂把这一阶段的学习内容整理成笔记,巩固所学知识,同时也会参考一些博客,书籍上的内容,查漏补缺,给自己充充电

  • 函数的两种创建自定义方式

    函数的两种创建自定义方式

  • JavaScript 基础二

    函数 函数:函数就是封装了一段可以重复执行的代码块. function fn(){ console.log('我是函数') } fn(); function getSum(a,b){ return a ...

  • jQuery闭包理解

    参考https://tylermcginnis.com/async-javascript-from-callbacks-to-promises-to-async-await/ 闭包定义-是指有权访问另 ...

  • 深入理解 Python 内部函数和闭包(进阶)

    大家好,我是安果! 本文以内部函数为主线,深入讲解内部函数和闭包的应用场景和原理,学会后你的 Python 水平会再上一个台阶,对工作面试或实战应用都会很有帮助 本文包括: 函数是一等公民 内部函数定 ...

  • 全国人大常委会关于《中华人民共和国刑法》第九章渎职罪主体适用问题的解释(附:理解与适用)

    ☞[招募律师站长]☜ 全国人民代表大会常务委员会关于<中华人民共和国刑法>第九章渎职罪主体适用问题的解释 (2002年12月28日通过) 全国人大常委会根据司法实践中遇到的情况,讨论了刑法 ...

  • 体谅与理解

    人生的路上,如果懂得体谅,懂得理解,懂得宽容,日子就会很温馨,也会很安宁. 人生的路上,如果缺少体谅,不能理解,没有谦让,日子就会很糟糕,越过越烦恼. 生活中的很多烦恼,就是源于我们不能够体谅,过分在 ...

  • 色盲患者看到的世界永远黑白的,他们是无法理解世界的真实色彩的

    哲学那点事(五)--我能认知什么?色盲患者看到的世界永远黑白的,他们是无法理解世界的真实色彩的色盲是由于视网膜视锥细胞中的光敏色素异常或不全所导致的色觉紊乱,从而缺乏辨别一种或多种颜色的能力.色盲又分 ...

  • 特级教师:初中阅读理解33个答题公式 60篇训练题,挑战1分不扣

    语文考试中,同学们普遍认为最难的不是作文,而是阅读理解.初中语文阅读理解篇幅大,内容深奥.要么不知道怎么作答,要么答了很多,却不在踩分点上,自我感觉良好,但得分却少得可怜. 而且在考试中,因为阅读理解 ...

  • 古人是这样藏锋的,大多数人理解错了!

    对于书法的初学者,想必在书店市场上应该看到许多关于书法笔法的论述,很多教材都在强调藏锋的重要性,起笔要逆锋藏锋,收笔也要回锋一下,特别是初学颜真卿楷书的人,老师一般会让学生逆锋起笔,如下图所示: 这种 ...

  • 电路模拟器如何帮助您理解任何电路

    电路模拟器是一种"观察"电路功能的工具.电子设备不容易用肉眼检查,如果你打开一个音频放大器,如果你没有设计和建造电子电路的经验,就很难判断它是做什么的. 模拟理解电路 电路模拟器使 ...

  • 法考过关经验贴|六字箴言“基础”、“理解”与“计划”

    法考并不是高考,分数高低对个人来说影响并不大,因此怎样用最少的时间与精力达到目标就是最重要的课题.我的法考经历可以总结为每天学一点,一学小半年:主要经验是"基础"."理解 ...