手机版

用最容易理解的代码帮助初学者理解javascript闭包推荐

时间:2021-10-10 来源:互联网 编辑:宝哥软件园 浏览:

最近看了几篇关于javascript闭包的文章,包括最近如火如荼的汤姆叔叔系列,以及《javascript高级程序设计》中的文章.我不能理解他们。其中的一些代码在大学课本上从来没有出现过,就像天书一样。还好最近遇到了两本好书,《ppk on javascript》和《object-oriented JavaScript》。在正字法阅读中,后者还没有中文版,但前者还是建议阅读原文,并不复杂。有兴趣的朋友可以看一下,适合想进阶的人。今天结合这两本书,我将以最简单的语言和最流行的方式来讨论javascript中的闭包。既然是新手,请指出一些错误。谢谢你。1.准备知识。1.函数作为函数参数。在学习javascript的过程中,你必须始终有一个不同于其他语言的概念:函数不是什么特殊的东西,它也是一种数据,与bool、string、number无关。函数的参数可以是字符串、数字、bool,如:函数(a,b){ return a b;}但是您也可以传入函数。是的,你没听错。函数的参数就是函数!您有以下两个功能:复制代码如下: //将三个数字翻倍。函数Multiplybytwo (a,b,c) {var i,ar=[];for(I=0;I 3;i ) { ar[i]=自变量[I]* 2;}返回ar;}复制代码如下: //给函数addOne(a)添加一个数字{ return a 1;}然后使用复制代码如下: var myar=[];//首先,将每个数字乘以2,并使用循环myar=multiplyByTwo(10,20,30);//给每个数字加一,然后对(var I=0;I 3;I){ myar[I]=AdDone(myar[I]);}注意这个过程已经用了两个周期,但是还有改进的空间。最好这样做:复制代码如下: Function multiplytwo(a,b,c,addone) {var i,ar=[];for(I=0;I 3;i ) { ar[i]=addOne(参数[I]* 2);}返回ar;}这样,函数作为参数传入,并在第一个循环中直接调用。这样的函数就是著名的回调函数。2.作为返回值,函数在函数中可以有返回值,但我们一般熟悉的是数值的返回。例如,复制代码如下:函数ex(){ return 12}。然而,一旦你意识到一个函数只是一种数据,你也可以考虑返回一个函数。注意以下功能:复制代码如下:函数a() {alert('A!'。);返回函数(){ alert('B!');};}它返回了一个弹出窗口“b!”功能。接下来使用它:复制代码如下: var newFunc=a();newFunc();结果如何呢?当执行()时,首先执行“a!”突然出现。”此时,newFunc接受a的返回值,函数——成为此时a返回的函数。当newFunc再次执行时,“b!"3.javascript的范围JavaScript的范围非常特殊。它基于函数,而不是其他语言中的块(如循环)。看下面的例子:var a=1;函数f(){ var b=1;返回a;}如果此时尝试获取b的值:如果尝试在firebug中输入alert(b),会得到一条错误消息:b未定义。为什么可以这样理解:你所处的编程环境或窗口是一个顶级函数,就像一个宇宙,但b只是你内部函数中的一个变量,宇宙中一个小行星上的一个点,所以在这个环境中不能称之为;相反,这个内部函数可以调用变量A,因为它暴露在整个宇宙中,无处可藏,它也可以调用B,因为它在自己的星球上,在函数内部。就上面的例子而言,a在f()外可见,b在f()内不可见,a可见,b也可见。比较复杂:复制代码如下: var a=1;//b、c在这一层是看不见的。函数f(){ var b=1;函数n () {//a,b,c都可以调用这个n函数,因为a,b是暴露的,c是它自己的内部var c=3;}}问你,函数b可以调用变量c吗?不,记住javascript的作用域在函数中,c在n里面,所以f看不到。

正式开始谈闭包:先看这张图:

假设g、f、n代表三个层次的函数,层次如图,其中a、b、c为变量。根据上面提到的范围,我们有以下结论:如果你在A点,你不能引用B,因为B对你来说是无形的。只有C可以引用B闭包。矛盾的是,发生了以下情况:

n突破了f的极限!跑向同一层!因为函数只识别定义它们的环境(不是执行的时候,这很重要),所以N中的C仍然可以访问B!此时,a仍然无法访问b!但是这是怎么发生的呢?如下:闭包1:复制代码如下:函数f(){ var b=' b ';Return函数(){ //没有名字,所以是匿名函数return b;}}请注意,返回的函数可以访问其父函数中的变量b。此时如果要取b的值,当然是未定义的,但如果这样做:复制代码如下: var n=f();n();你可以得到b的值!虽然此时n函数在f之外,b是f之内的变量,但是f之内有一个内鬼,它返回b的值.现在大家都觉得有点。闭包2:复制代码如下: var n;函数f(){ var b=' b ';n=function(){ return b;}}如果此时调用f会发生什么?然后生成一个n的全局作用域函数,但是它可以访问f的内部,仍然返回b的值,和上面类似!闭包3:您也可以使用闭包访问函数的参数来复制代码如下: function f(arg){ var n=function(){ return arg;};arg返回n;}此时,如果使用:复制代码如下: var m=f(123);m();结果是124,因为此时f中返回的匿名函数已经被转手了两次,第一次给了n,然后外面给了m,但是它的本质没有变,所以定义的时候父函数的参数都返回闭包4:复制的代码如下: var getValue,setValuefunction(){ var secret=0;getValue=function(){ return secret;};setVaLue=function(v){ secret=v;};})运行:复制代码如下: getvalue()0 setvalue(123)getvalue()123。这无需解释。如果你有面向对象的语言基础(比如C#),这里的getvalue和setvalue类似于一个对象的属性访问器,你可以通过这两个访问器赋值和取值。书中有几个闭包的例子,而不是能够访问内容,但是使用上面的四个原则就足够了。希望它能起到吸引更多关注的作用,让javascript advancers对闭包有更深的理解。

版权声明:用最容易理解的代码帮助初学者理解javascript闭包推荐是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。