当前位置: 首页 > 科技观察

匿名函数自执行和关闭是一回事吗?

时间:2023-03-13 20:10:06 科技观察

1.匿名函数自执行概述在javascript中,有些东西看似复杂其实很容易理解,但是理解它们需要一定的技巧,同时理解它们也很重要。一旦你了解他们,他们就会为你打开它。一扇门让你知道它是什么,为什么会这样。因为它们是紧密集成和独立的。今天我们就来说说这些简单而重要的事情。1.什么是函数表达式和函数声明?您已经知道函数是特殊对象,然后您还了解函数声明和函数表达式。//函数声明functionshow(){console.log(12);}//函数表达式varshow=function(){console.log(5);};2.看到函数表达式并不奇怪,因为函数是对象,所以可以将对象赋值给变量或者作为参数传递。//函数声明functionshow(){console.log(12);}//函数表达式varshow=function(){console.log(5);};函数可以赋值给变量,像数字一样传递给参数的现象叫做一等函数,所以不难。3.说到对象,再来说说引用和拷贝的区别。vara=12;varb=a;b+=5;alert(a);//12没什么好解释的,复制b,怎么改b跟a没关系。vararr1=[12,5,8];vararr2=arr1;arr2.pop();alert(arr1);//12,5我擦了,怎么回事?记住一句话,基本类型的副本是与原件无关的直接副本,而对象的副本只是将地址指向被复制的副本。我有一个馒头,照抄基本款就相当于照着我的馒头给你做了一个,吃你的馒头不影响我手里的那个。我有一把钥匙,可以打开共享房屋的门。对象复制是一个参考,就算复制了一个钥匙,你要是把马桶拆了,我也得忍住。你明白吗?4.我只想说说函数传参的事。这是许多开发人员犯错误的地方。我不会在这里解释。我一解释,你就不会明白了。告诉你吧。访问变量有传值和传引用两种方式,但参数只能传值。当参数类型为基本类型时,将传递的值复制到局部变量,而对于复合类型,则复制地址。好吧,让我们直接来看一个例子。别紧张。functionsetName(obj){obj.name="尼古拉斯·刁·大斌"//关键obj=newObject();obj.name="帅斌"}varPerson=newObject();setName(Person);alert(Person.姓名);5.函数的this和argumentjs里面没有一个最恶心的东西。这个在函数里说吧。functionshow(){console.log(this);}//windowvarshow=function{console.log(this);}//窗口注意,varperson={name:"leo",show:function(){this.name='莱奥劳';console.log(this);//人对象对象}};但是这里有一个奇怪的地方,很多人认为是bug,面试经常测试。varperson={name:"leo",show:function(){this.name='leolau';console.log(this);//人对象objectvarbug=function(){console.log(this);//窗口}漏洞();}};如何解决?varperson={name:"leo",show:function(){varthat=this;this.name='leolau';console.log(this);//人对象objectvarbug=function(){console.log(that);//人}bug();}};至于论据,我会给你一个实际应用。未知参数的个数无限累加。你怎么看待这件事?6.什么是匿名函数自执行以及如何在实际库中应用匿名函数自执行,注意,注意只有这个名字和iife没有其他的名字,比如封闭空间,这是让大家理解的话他们创造。他的一个重要用途是防止命名冲突,也是一个组织和架构库,比如jquery。命名冲突a.jsvara=12;b.jsvara=5;同时参考a、b封底封面。如何防止覆盖前后的命名冲突。vara=12;(函数(){vara=5;})();这里的ainiifes是不会干扰outsidea的,那么问题来了,如果我想改变outsidea怎么办?这也是很多jquery库的做法。这样做:(function(global,$){$.a=12;global.a=5;})(window,jquery);既满足外部修改,又防止变量污染。2.闭包概述经常听到闭包这个词,或者说匿名函数的自执行。它们是一样的吗?1.什么是闭包?不想扣定义,直接上例子。functionparent(firstname){returnfunction(lastname){console.log(firstname+'·咲·'+lastname);}}parent('Nicholas')('大斌哥');看图:函数执行完会被销毁(这里不说入栈操作,看图看懂),然后各种变量会被垃圾回收,这里父函数确实被销毁了,但是firstName参数没有被垃圾回收,内存被释放,在内存中仍然可以返回函数的使用,好像返回中的函数在自己的函数中关闭了父函数的资源,资源消失的现象destroyedbythisfunctionisclosedandstillbeusedinthechildfunctioncalledclosure。注意,匿名函数的自执行只是产生闭包的一种情况。闭包是现象或情况。很多情况下匿名函数的自执行是不切实际的并且会产生闭包,所以它们基本上是两个不同的东西,不应该混淆。以此类推,在window系统中,你的子文件夹中使用的文件的父文件夹是不能删除的。2.实际应用,有很多种情况,先从一道面试题说起。functionfn{vararr=[];for(vari=0;i<3;i++){arr.push(function(){console.log(i);});}returnarr;}vararrFn=fn();arrFn[0]();//3arrFn[1]();//3arrFn[2]();//3类似的一道题是在循环中使用events,event中的i有问题,如下。for(vari=0;i