javascript从作用域链谈闭包_javascript技巧

javascript从作用域链谈闭包_javascript技巧

ID:30776483

大小:232.03 KB

页数:7页

时间:2019-01-03

javascript从作用域链谈闭包_javascript技巧_第1页
javascript从作用域链谈闭包_javascript技巧_第2页
javascript从作用域链谈闭包_javascript技巧_第3页
javascript从作用域链谈闭包_javascript技巧_第4页
javascript从作用域链谈闭包_javascript技巧_第5页
资源描述:

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

1、javascript从作用域链谈闭包神马是闭包关于闭包的概念,是婆说婆有理。闭包是指冇权访问另外一个函数作用域中的变量的函数这概念有点绕,拆分一2从概念上说,闭包有两个特点:•1、函数•2、能访问另外一个函数作用域中的变量在ES6之前,Javascript只有函数作用域的概念,没有块级作用域(但calch捕获的异常只能在catch块中访问)的概念(IIFE叮以创建局部作用域)。每个函数作用域都是封闭的,即外部是访问不到函数作用域小的变量。functiongetName(){varname=〃美女的名字〃;conso

2、le,log(name);//〃美女的名字〃}functiondisplayName(){console,log(name);//扌艮错}但是为了得到美女的名字,不死心的单身汪把代码改成了这样:functiongetName(){varname=〃美女的名字〃;funcliondisplayNameO{console・log(name);}returndisplayName;}var美女二getName();美女()//〃美女的名字〃这下,美女是一个闭包了,单身汪想怎么玩就怎么玩了。(但并不推荐单身汪用屮文做变量名

3、的写法,大家不要学)。关于闭包呢,还想再说三点:1、闭包可以访问当前函数以外的变量functiongetOuter(){vardate='815,;functiongetDate(str){console.log(str+date);//访问外部的date}returngetDate(J今天是://"今天是:815〃}getOuter();getDate是一个闭包,该函数执行时,会形成一个作用域A,A中并没有定义变量date,但它能在父一•级作用域小找到该变量的定义。2、即使外部函数已经返回,闭包仍能访问外部函数定

4、义的变量functiongetOuter(){vardate二'815';functiongetDate(str){console.log(str+date);//访问外部的date}returngetDate;//外部函数返冋}vartoday二getOuter();todayC今天是://〃今天是:815〃today(J明天不是:’);//"明天不是:815〃3、闭包可以更新外部变量的值functionupdateCount(){varcount=0;functiongetCount(val){count=va

5、l;console,log(count);}returngctCount;//外部函数返回}varcount=updateCount();count(815);//815count(816);//816作用域链为毛闭包就能访问外部函数的变量呢?这就要说说Javascript屮的作用域链To__Javascript屮有一个执行环境(executioncontext)的概念,它定义了变量或函数冇权访问的其它数据,决定了他们各自的行为。每个执行环境都冇一个与Z关联的变量对彖,环境中定义的所有变量和函数都保存在这个对象中。

6、你可以把它当做Javascript的一个普通对象,但是你只能修改它的属性,却不能引用它。变量对象也是有父作用域的。当访问一个变量时,解释器会首先在当前作用域查找标示符,如果没有找到,就去父作用域找,直到找到该变量的标示符或者不再存在父作用域了,这就是作用域链。作用域链和原型继承有点类似,但乂有点小区别:如果去查找一个普通对象的属性吋,在当前对象和其原型屮都找不到时,会返冋undefined;但查找的属性在作用域链中不存在的话就会抛出ReferenceError0作用域链的顶端是全局对象。对于全局环境中的代码,作用域

7、链只包含一个元索:全局对象。所以,在全局环境中定义变量的时候,它们就会被定义到全局对象中。当函数被调用的时候,作用域链就会包含多个作用域对象。•全局环境关于作用域链讲得略多(红皮书上有关于作用域及执行环境的详细解释),看一个简单地例子://my_script・js"usestrict";varfoo二1;varbar二2;在全局环境小,创建了两个简单地变量。如前而所说,此时变量对象是全局对象。•Non-nestedfunctions改动一下代码,创建一个没有函数嵌套的函数:〃usestrict";varfoo=1;

8、varbar=2;functionmyFunc(){//--define1ocal-to-functionvariablesvara=1;varb=2;varfoo=3;console.log(/zinsidemyFunc〃);}console.log(〃outside〃);//--andthen,callit:myFunc();当myFunc被定义的时候,

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

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

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