蚂蚁文库
换一换
首页 蚂蚁文库 > 资源分类 > DOC文档下载
 

理解javascript中的作用域和上下文.doc

  • 资源ID:619409       资源大小:109.00KB        全文页数:14页
  • 资源格式: DOC        下载权限:游客/注册会员    下载费用:10积分 【人民币10元】
快捷注册下载 游客一键下载
会员登录下载
三方登录下载: 微信快捷登录 QQ登录  
下载资源需要10积分 【人民币10元】
邮箱/手机:
温馨提示:
支付成功后,系统会自动生成账号(用户名和密码都是您填写的邮箱或者手机号),方便下次登录下载和查询订单;
支付方式: 微信支付    支付宝   
验证码:   换一换

 
友情提示
2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,既可以正常下载了。
3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰   

理解javascript中的作用域和上下文.doc

优就业JS教程理解JAVASCRIPT中的作用域和上下文JAVA对于作用域SCOPE和上下文CONTEXT的实现是这门语言的一个非常独到的地方,部分归功于其独特的灵活性。函数可以接收不同的的上下文和作用域。这些概念为JAVA中的很多强大的设计模式提供了坚实的基础。然而这也概念也非常容易给开发人员带来困惑。为此,本文将全面的剖析这些概念,并阐述不同的设计模式是如何利用它们的。STATEMENT作者景庄,WEB开发者,主要关注JAVA、NODEJS、REACT、DOCKER等。上下文CONTEXT和作用域SCOPE首先需要知道的是,上下文和作用域是两个完全不同的概念。多年来,我发现很多开发者会混淆这两个概念包括我自己,错误的将两个概念混淆了。平心而论,这些年来很多术语都被混乱的使用了。函数的每次调用都有与之紧密相关的作用域和上下文。从根本上来说,作用域是基于函数的,而上下文是基于对象的。换句话说,作用域涉及到所被调用函数中的变量访问,并且不同的调用场景是不一样的。上下文始终是THIS关键字的值,它是拥有控制当前所执行代码的对象的引用。变量作用域一个变量可以被定义在局部或者全局作用域中,这建立了在运行时RUNTIME期间变量的访问性的不同作用域范围。任何被定义的全局变量,意味着它需要在函数体的外部被声明,并且存活于整个运行时RUNTIME,并且在任何作用域中都可以被访问到。在ES6之前,局部变量只能存在于函数体中,并且函数的每次调用它们都拥有不同的作用域范围。局部变量只能在其被调用期的作用域范围内被赋值、检索、操纵。需要注意,在ES6之前,JAVA不支持块级作用域,这意味着在IF语句、SWITCH语句、FOR循环、WHILE循环中无法支持块级作用域。也就是说,ES6之前的JAVA并不能构建类似于JAVA中的那样的块级作用域变量不能在语句块外被访问到。但是,从ES6开始,你可以通过LET关键字来定义变量,它修正了VAR关键字的缺点,能够让你像JAVA语言那样定义变量,并且支持块级作用域。看两个例子ES6之前,我们使用VAR关键字定义变量FUNCTIONFUNC{IFTRUE{VARTMP123}CONSOLELOGTMP//123}之所以能够访问,是因为VAR关键字声明的变量有一个变量提升的过程。而在ES6场景,推荐使用LET关键字定义变量FUNCTIONFUNC{IFTRUE{LETTMP123}CONSOLELOGTMP//REFERENCEERRORTMPISNOTDEFINED}这种方式,能够避免很多错误。什么是THIS上下文上下文通常取决于函数是如何被调用的。当一个函数被作为对象中的一个方法被调用的时候,THIS被设置为调用该方法的对象上VAROBJ{FOOFUNCTION{ALERTTHISOBJ}}OBJFOO//TRUE这个准则也适用于当调用函数时使用NEW操作符来创建对象的实例的情况下。在这种情况下,在函数的作用域内部THIS的值被设置为新创建的实例FUNCTIONFOO{ALERTTHIS}NEWFOO//FOOFOO//WINDOW当调用一个为绑定函数时,THIS默认情况下是全局上下文,在浏览器中它指向WINDOW对象。需要注意的是,ES5引入了严格模式的概念,如果启用了严格模式,此时上下文默认为UNDEFINED。执行环境CUTIONCONTEXTJAVA是一个单线程语言,意味着同一时间只能执行一个任务。当JAVA解释器初始化执行代码时,它首先默认进入全局执行环境CUTIONCONTEXT,从此刻开始,函数的每次调用都会创建一个新的执行环境。这里会经常引起新手的困惑,这里提到了一个新的术语执行环境CUTIONCONTEXT,它定义了变量或函数有权访问的其他数据,决定了它们各自的行为。它更偏向于作用域的作用,而不是我们前面讨论的上下文CONTEXT。请务必仔细的区分执行环境和上下文这两个概念注英文容易造成混淆。说实话,这是个非常糟糕的命名约定,但是它是ECMA规范制定的,你还是遵守吧。每个函数都有自己的执行环境。当执行流进入一个函数时,函数的环境就会被推入一个环境栈中CUTIONSTACK。在函数执行完后,栈将其环境弹出,把控制权返回给之前的执行环境。ECMA程序中的执行流正是由这个便利的机制控制着。执行环境可以分为创建和执行两个阶段。在创建阶段,解析器首先会创建一个变量对象VARIABLEOBJECT,也称为活动对象ACTIVATIONOBJECT,它由定义在执行环境中的变量、函数声明、和参数组成。在这个阶段,作用域链会被初始化,THIS的值也会被最终确定。在执行阶段,代码被解释执行。每个执行环境都有一个与之关联的变量对象VARIABLEOBJECT,环境中定义的所有变量和函数都保存在这个对象中。需要知道,我们无法手动访问这个对象,只有解析器才能访问它。作用域链THESCOPECHAIN当代码在一个环境中执行时,会创建变量对象的一个作用域链SCOPECHAIN。作用域链的用途是保证对执行环境有权访问的所有变量和函数的有序访问。作用域链包含了在环境栈中的每个执行环境对应的变量对象。通过作用域链,可以决定变量的访问和标识符的解析。注意,全局执行环境的变量对象始终都是作用域链的最后一个对象。我们来看一个例子VARCOLOR“BLUE“FUNCTIONCHANGECOLOR{VARANOTHERCOLOR“RED“FUNCTIONSWAPCOLORS{VARTEMPCOLORANOTHERCOLORANOTHERCOLORCOLORCOLORTEMPCOLOR//这里可以访问COLOR,ANOTHERCOLOR,和TEMPCOLOR}//这里可以访问COLOR和ANOTHERCOLOR,但是不能访问TEMPCOLORSWAPCOLORS}CHANGECOLOR//这里只能访问COLORCONSOLELOG“COLORISNOW“COLOR上述代码一共包括三个执行环境全局环境、CHANGECOLOR的局部环境、SWAPCOLORS的局部环境。上述程序的作用域链如下图所示从上图发现。内部环境可以通过作用域链访问所有的外部环境,但是外部环境不能访问内部环境中的任何变量和函数。这些环境之间的联系是线性的、有次序的。对于标识符解析变量名或函数名搜索是沿着作用域链一级一级地搜索标识符的过程。搜索过程始终从作用域链的前端开始,然后逐级地向后全局执行环境回溯,直到找到标识符为止。闭包闭包是指有权访问另一函数作用域中的变量的函数。换句话说,在函数内定义一个嵌套的函数时,就构成了一个闭包,它允许嵌套函数访问外层函数的变量。通过返回嵌套函数,允许你维护对外部函数中局部变量、参数、和内函数声明的访问。这种封装允许你在外部作用域中隐藏和保护执行环境,并且暴露公共接口,进而通过公共接口执行进一步的操作。可以看个简单的例子FUNCTIONFOO{VARLOCALVARIABLEPRIVATEVARIABLERETURNFUNCTIONBAR{RETURNLOCALVARIABLE}}VARGETLOCALVARIABLEFOOGETLOCALVARIABLE//PRIVATEVAR

注意事项

本文(理解javascript中的作用域和上下文.doc)为本站会员(马老师)主动上传,蚂蚁文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知蚂蚁文库(发送邮件至2303240369@qq.com或直接QQ联系客服),我们立即给予删除!

温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们


网站客服QQ:2303240369

copyright@ 2017-2027 mayiwenku.com 

网站版权所有  智慧蚂蚁网络

经营许可证号:ICP备2024020385号



收起
展开