当前位置: 首页 > Web前端 > HTML

一篇带你了解JavaScript中的闭包和高级函数的文章

时间:2023-04-02 15:52:12 HTML

在JavaScript中,函数是一等公民。JavaScript是一门面向对象的编程语言,但它也有很多函数式编程的特性,比如Lambda表达式、闭包、高阶函数等,函数式编程是一种编程范式。函数dada(){vara=1;varb=function(){console.log(a);}returnb//b是闭包函数,因为它可以访问dada函数的作用域}JavaScript函数也是对象,可以有属性,可以赋值给变量,可以作为元素放入数组中,可以使用作为其他对象的属性,可以做任何事情。它可以做其他对象可以做的事情,也可以做其他对象不能做的事情。还可以做。功能与其他普通对象相同。它们有属性和方法,函数能做普通对象能做的事。学习JavaScript中的闭包和高级函数是一篇基础文章!那么什么是闭包呢?闭包是一个函数,可以访问其外部范围内的变量和参数。varfunc=(function(){varitem=0;return{add:function(num){item+=typeofnum==='number'?num:1;},value:function(){returnitem;}}})();闭包函数可以访问创建它的上下文中的变量和参数,this和arguments除外。闭包:函数用作返回值。除了接受函数作为参数外,高阶函数还可以将函数作为结果值返回。闭包的形成与变量的作用和变量的生命周期密切相关。变量范围:varfunc=function(){vara=1;控制台日志(一);//1}函数();控制台日志(一);//UncaughtReferenceError:aisnotdefinedClosureisAfunctionthatcanaccessvariablesinsideotherfunctions.闭包的重点是变量的作用域和变量的生命周期。变量范围//变量范围varmy=function(){vara=1;console.log('我的',a);//1}我的();console.log(a)//ReferenceError:aisnotdefinedvariabledeclarationcycle//变量生命周期letfu=function(){leta=0;一个++;console.log('dada',a);}fu();//1fu();//1fu();//1letfunc=function(){让a=0;返回函数(){a++;console.log('a',a);}}让fun=func()fun();//1乐趣();//2乐趣();//3闭包中的变量不被销毁,这涉及到垃圾回收机制,即清除标记和引用计数functionnum(){for(vari=0;i<10;i++){setTimeout(function(){console.log('da',i)//10},0)}}num();functionnum1(){for(vari=0;i<10;i++){(function(i){setTimeout(function(){console.log('da',i)},0)})(i)//1,2,3,...,10}}num1()什么是闭包的例子:函数da(){vara=1;函数dada(){console.log(a);}返回dada}vard=da();d();//1如果闭包不是那么必要,请不要创建它,因为闭包在处理速度和内存消耗方面对性能有负面影响。闭包的形式与变量的作用域和变量的生命周期密切相关。变量范围:变量范围是指变量的有效范围。当函数中声明的变量不带关键字var时,该变量就成为全局变量。当变量声明为var时,这个变量就成为局部变量,只能在函数内部访问,不能在函数外部访问。示例:varfunc=function(){vara=1;警报(一);//1};func();alert(a);//UncaughtReferenceError:aisnotdefined嵌套示例:vara=1;varfun=function(){varb=2;varfunc1=function(){varc=3;警报(二);//2警报(a);//1}func1();警报(c);//c未定义};乐趣();变量生命周期:闭包的另一个重要概念,变量生命周期对于全局变量的生命周期来说是永久的,而对于函数内部的局部变量来说是短暂的,在调用结束的时候就全部销毁了。varfunc=function(){vara=1;};func();varfunc=function(){vara=1;返回函数(){a++;警报(一);}};varda=func();da();//2da();//3da();//4个闭包函数作为返回值functionnum(arr){returnarr.reduce(function(x,y){returnx+y;});}num([1,2,3]);//6变成一个函数functionfunc(arr){varsum=function(){returnarr.reduce(function(x,y){returnx+y;});}returnsum;}//调用函数varda=func([1,2,3]);//调用函数//运行da();//6varda1=func([1,2]);varda2=func([1,2]);da1==da2//false每次调用都返回一个用闭包缓存的新函数:functionadd(a){returna+1;}使用闭包进行缓存:闭包的作用是封装变量,闭包可以封装成私有变量:varda=function(){vara=1;for(vari=0;iy){返回1;}返回0;});安慰。日志(arr);//[1,2,10,20]vara1=['B','A','C'];vara2=a1.sort();a1;//['A','B','C']a2;//['A','B','C']a1===a2;//true,a1和a2是同一个对象every()方法可以判断数组的所有元素是否满足测试条件find()方法用于查找第一个满足条件的元素。findIndex()方法返回该元素的索引。高阶函数是输入参数中有函数的函数,或者是输出函数的函数。functionadd(){varnum=0returnfunction(a){returnnum=num+a}}varadder=add()adder(1)//输出:1adder(2)//输出:3个高阶函数满足条件:函数作为参数传递,函数作为返回值输出回调函数:vargetUserInfo=function(userId,callback){$.ajax('http://xxx.com/getUserInfo?'+userId,function(data){if(typeofcallback==='function'){callback(data);}});}getUserInfo(522624714,function(data){alert(data.userName);});//从小到大排序[1,5,3].sort(function(a,b){returna-b;});//输出:[1,3,5]//排列[1,5,3】从大到小。排序(函数(a,b){rreturnb-a;});//Output:[5,3,1]什么是函数式编程,函数式编程是一种编程形式,它允许你将函数作为参数传递给其他函数,并将函数作为值return中JavaScript,函数是一类特殊的对象:functionhello(){console.log('hello');}hello();hello.name='da';console.log(hello.name);//daconstnum=function(x){returnx*x;}num(8);//64高阶函数是接收函数作为参数或返回函数作为输出值的函数。高阶函数实战:constarr1=[1,2,3];constarr2=arr1.map(function(x){returnx*2;});console.log(arr2);constarr1=[1,2,3];constarr2=arr1.map(x=>x*2);结论简单来说,高阶函数就是可以接受一个函数作为参数并返回一个值,返回一个函数的函数。闭包允许您从内部函数访问外部函数范围。闭包是一个可以访问另一个函数范围内的变量的函数。关于当前文章的内容,涉及到前端和PHP知识点。有兴趣的可以关注一下。很荣幸被你发现。真是有见地!感谢您的关注。在以后的日子里,希望大家一直默默支持我,我会努力写出更多优秀的作品。我们一起成长,从零开始学习编程,将Web前端领域、数据结构与算法、网络原理,通俗易懂的呈现给小伙伴们。分享Web前端相关的技术文章、工具资源、精选课程、热点资讯。推荐阅读1、你对这个、new、bind、call、apply了解多少?那我告诉你2、为什么要学习JavaScript设计模式,因为它是核心反馈:如果本账号内容有问题(例如:涉及版权或其他问题),请及时联系我们进行整改。第一次就做对。感谢阅读,原创不易,喜欢请点个赞,这是我写作最大的动力。欢迎来到达达简书!这是一个有品质有态度的博客