javascript中的作用域和闭包详解_javascript技巧

javascript中的作用域和闭包详解_javascript技巧

ID:30777776

大小:61.75 KB

页数:4页

时间:2019-01-03

javascript中的作用域和闭包详解_javascript技巧_第1页
javascript中的作用域和闭包详解_javascript技巧_第2页
javascript中的作用域和闭包详解_javascript技巧_第3页
javascript中的作用域和闭包详解_javascript技巧_第4页
资源描述:

《javascript中的作用域和闭包详解_javascript技巧》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、javascript中的作用域和闭包详解一、JavaScript作用域JavaScript变量实际上只有两种作用域,全局变量和函数的内部变量。在函数内部任何一个地方定义的变量(varscope)其作用域都是整个函数体。全局变量:指的是window对象卜•的对象属性。作用域划分:基于上下文,以函数进行划分的,而不是由块划分的。强调两点:1.在同一作用域屮,JavaScript是允许变量的重复定义,并且后一个定义将覆盖询一个定义。2.函数内部如杲不加关键字vh而定义的变量,默认为全局变量。varscope二〃

2、global";functiont(){console,log(scope);//"globalscope二"loceil"console.log(scope);//"local"}10;console,log(scope);//"local"varscope二〃global〃;functiont(){console.log(scope);//"undefineel"varscope二〃local"console,log(scope);//"local"}10;console.log(scope);//"

3、global"在变量解析过程中首先查找局部的作用域,然后查找上层作用域。在第一段代码的函数当中没有定义变量scope,T是查找上层作用域(全局作用域),进而进行输出其值。但是在第二段代码的函数内定义了变量scope(无论是在consoleZ后述是Z前定义变量,都认为在此作用域拥有变量scope),于是不再向上层的作用域进行查找,直接输出scopeo但是不幸的是此时的局部变量i并没右赋值,所以输出的是undefinedo〃所以根据函数作用域的意思,口J以将上述第二段代码重写如下:varscope二"glob

4、al";functiont(){varscope;console,log(scope);scope二〃local〃consolc.log(scope);}10;由于函数作用域的特性,局部变量在整个函数体始终是rti定义的,我们可以将变量声明”提前“到函数体顶部。varb;//第1步functionfun(){b二,zchange〃;}alert(b);//输出undefined,由于第1步只定义未赋值varb;//第1步functionfun(){b=z,changc";}fun();//调用上述函数al

5、ert(b);//输出change当使用var声明一个变量时,创建的这个属性是不可配置的,也就是说无法通过delete运算符删除。二、作用域实例functionbuttonlnit(){for(vari二1;i〈4;i++){varb=document.getElemenlByTd(z,button"+i);b.addEventListener("click",function(){alert("Button〃+i);},

6、false);}}window.onload=butlonIniI;Buttonlid=,,button2,,>Button2id=,zbutton3,z>Button3当注册事件结束后,i的值为4,当点击按钮时,事件函数即functionO{alertCButton^+i);}这个匿名函数中没有i,根据作用域链

7、,所以到buttonTnit函数中找,此时i的值为4,所以弹岀”buttond“。在jsm,闭包主要涉及到js的几个其他的特性:作用域链,垃圾(内存)回收机制,函数嵌套,等等。1.作用域链:简单來说,作用域链就是函数在定义的时候创建的,用于寻找使用到的变量的值的一个索引,而他内部的规则是,把函数自身的本地变量放在最前面,把自身的父级函数中的变量放在其次,把再高一级函数中的变量放在更后而,以此类推直至全局对象为止。当函数小需要查询一个变量的值的时候,js解释器会去作用域链去查找,从最前面的本地变量屮先找,如

8、果没有找到对应的变量,则到下一级的链上找,一旦找到了变量,则不再继续。如果找到最后也没找到需耍的变量,则解释器返回undefinedo2.Javascript的垃圾冋收机制:在Javascript中,如果一个对象不再被引用,那么这个对象就会被GC回收。如果两个对象互相引用,而不再被第3者所引用,那么这两个互相引用的对象也会被回收。因为函数a被b引用,b乂被3外的c引用,这就是为什么函数a执行后不会被冋收的原因。构建一个闭包,这

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。