闭包的定义及作用

闭包的定义及作用1 闭包的定义 闭包就是能够读取其他函数内部变量的函数 在 js 中 可以将闭包理解成 函数中的函数 nbsp nbsp nbsp 如下代码中 f2 函数就是闭包 functionf1 varm 10 functionf2 alert m 10 2 闭包的作用 nbsp nbsp nbsp A 可以读取函数内部的变量 nbsp nbsp nbsp B 让这些变量的值始终保存

1、闭包的定义:闭包就是能够读取其他函数内部变量的函数。在js中,可以将闭包理解成“函数中的函数“。

     如下代码中f2()函数就是闭包:

 function f1(){     var m = 10;     function f2(){       alert(m); // 10     } }

2
闭包的作用:

     A、可以读取函数内部的变量

     B、让这些变量的值始终保存在内存中。这是因为闭包的执行依赖外部函数中的比那辆,只有闭包执行完,才会释放变量所占的内存

3、使用闭包的注意事项

   (1)  问题:由于闭包会使得函数中的变量都被保存在内存中,内存消耗大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能会造成内存泄露。

              解决方法:在退出函数之前,将不使用的局部变量全部删掉

   (2)  问题:闭包会在父函数外部,改变父函数内部变量的值。

              如果把父函数当做对象使用,把闭包当做公用方法,把内部变量当做私有属性,此时不要随便改变父函数内部变量的值。

             如下面的例子:

 //----代码一  var name = "The Window";   var object = {     name : "My Object",     getNameFunc : function(){       return function(){ //js中,函数就是作用域         return this.name; // 闭包 + this,造成的问题,函数中的this不能访问到作用域外的变量       };     }   };   alert(object.getNameFunc()()); //this的作用域是在函数执行的时候确定,因为匿名函数是一个全局变量,因此this指向的是window对象 // 因此输出结果是:The Window //-----代码二   var name = "The Window";   var object = {     name : "My Object",     getNameFunc : function(){       var that = this; //--this指向object,保留了对象object在that里面,       return function(){         return that.name; //这里输出对象object的name属性的值       };     }   }; alert(object.getNameFunc()()); // 所以暑促值:My Object

    一道闭包的面试题

function fun(n,o){ console.log(o); return { fun:function(m){ return fun(m,n); } }; } var a = fun(0); a.fun(1); a.fun(2); a.fun(3); var b = fun(0).fun(1).fun(2).fun(3); var c = fun(0).fun(1); c.fun(2); c.fun(3); //问:三行a,b,c的输出分别是什么? var a = fun(0); a.fun(1); a.fun(2); a.fun(3); //undefined 0 0 0 var b = fun(0).fun(1).fun(2).fun(3); //undefined 0 1 2 var c = fun(0).fun(1); c.fun(2); c.fun(3); //undefined 0 1 1

看下面这段代码,调用fun后,会返回一个空对象

function fun(n,o){ return { } }
 function fun(n,o){ console.log(o); return { fun:function(m){ return fun(m,n); } }; } var a = fun(0);

注意:当调用函数的时候,传入的实参比函数声明时指定的形参个数少时,剩下的形参都被设定为undefined

上面调用函数var a=fun(0);  输出的结果如下:

console.log(o);   //undefined

a的值是调用fun(0)后返回的对象,即a的值如下:

{ fun:function(m){ return fun(m,0); } }

理解了这里,上面的题目就可以做出来了。

详细解答,参考链接:详细解答


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/232600.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • deb文件安装「建议收藏」

    deb文件安装「建议收藏」使用dpkg命令安装.deb文件使用-i参数。sudodpkg-i./google-chrome-stable_current_amd64.deb如果遇到缺少依赖项的任何问题,则必须运行以下apt命令对其进行修复:sudoaptinstall-f要通过dpkg命令删除软件包,我们将使用-r以下示例中的参数:sudodpkg-rGoogle-chrome-stable使用APT命令安装.deb文件使用aptinstall。sudoaptinstall./goo

    2022年5月27日
    44
  • springboot跨域携带cookie

    springboot跨域携带cookie解决springboot跨域问题importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importorg.springframework.web.cors.CorsConfiguration;importorg.springframework.web.cors.UrlBasedCorsConfigurationSource;.

    2022年6月22日
    166
  • kali更新源(软件更新,附kali源列表)

    kali更新源(软件更新,附kali源列表)kali更新源(软件更新)源列表见文末(2019年10月5日更新)1.vim/etc/apt/sources.list文件添加如图内容,保存退出即可。2.刷新软件包列表apt-getupdate注:VMwareWorkstation中的虚拟机需要调成桥接或者NAT模式,保证虚拟机可以上网。…

    2022年5月8日
    150
  • 界面传值,单例,模态[通俗易懂]

    界面传值,单例,模态

    2022年2月4日
    49
  • C语言编写一个计算器(附全源代码)「建议收藏」

    C语言编写一个计算器(附全源代码)「建议收藏」这个计算器其实是我老师布置的一个c语言大作业,捉摸着搞了那么久的东西不能浪费了吧,于是我分享下我的代码和大概思路给个关注点个赞,后续我会分享更多我们学生党的作业问题白嫖党们先看代码,我就先上上全代码,干!(一)软件环境:Devc++我用的这个软件哈,个人感觉这里功能简单,特别容易上手。看图说话,是不是很简单嘛,又不复杂。(二)设计方案根据自学所得栈进行数据和符号的存储再输出,先设立单独的数据栈符号栈,我们以top=-1为标准,判断其是否为空栈,当然也用到了学过的struct来构建栈,先把字符存

    2022年6月3日
    238
  • select into from 与 insert into select用法详解

    select into from 与 insert into select用法详解selectintofrom和insertintoselect都被用来复制表结构和表中数据,两者的主要区别为:selectintofrom要求目标表不存在,因为在插入时会自动创建。insertintoselectfrom要求目标表已存在数据库中。一、INSERTINTOSELECT语句  1、语句形式为:

    2022年7月15日
    19

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号