JS作用域链(自己收藏).docxVIP

  1. 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
JS作用域链(自己收藏)

JS作用域链(转载)(2013-02-28 14:39:16)javascript:;转载▼分类: /s/articlelist_1707273310_10_1.htmlJS 变量的作用域变量的作用域其实很简单:在函数内定义的局部变量只在本函数内有效,在所有函数体外定义的变量在JS代码的全局有限,叫全局变量。有一个特殊情况,如果有全局变量和局部变量重名了,局部变量优先级高于全局变量,为什么会这样?后面再加以解释。变量与对象属性在学习Javascript的时候,会发现变量的使用与对象属性非常类似,比如赋值,已经在表达式中的使用方式,你甚至就可以把JS里面的每一个变量都理解为对象的属性。var a = 10;var sampleObj = {value1:10; value2:20}sum = a + sampleObj.value1 //计算结果是20因为在Javascript解释器运行的时候,它总是会首先创建一个全局对象,你定义的全局变量其实就是这个全局对象的属性。在函数中定义的局部变量同样是对象的属性,这个对象比较特殊,它叫调用对象。在Javascript解释器每次执行一个函数的时候,都会为这个函数创建一 个执行环境,而这个执行环境会创建一个调用对象。不同的函数的执行环境是彼此独立的,而在所有函数之外的代码执行环境叫做全局执行环境。现在再回头总结一下,JS解释器解释代码前创建了一个全局对象,在代码执行到函数之前,代码在全局执行环境中;当解释器执行函数时,进入函数独立的执行环境,并创建调用对象,在函数中定义变量相当于定义了这个调用对象的一个属性。现在能理解了吧?变量的作用域链本文开头关于局部变量和全局变量优先级的问题,很快就能解释了,不过首先要知道作用域链的概念。“每个Javascript执行环境都有一个与它关联在一起的作用域链。”这是犀牛书上的表述,把它翻译成大白话就是:作用域的优先级顺序。作用域链作用:当Javascritp需要查询变量x的值时,它首先开始查询作用域链的第一个对象,如果该对象有名为x的属性,就采用这个值,如果没有,就查询作用域链上的第二个对象,以此类推。作用域链的顺序:根据执行环境来定,假设当前执行环境在两层嵌套的局部函数中,当前函数的调用对象处于作用域链第一位,外层函数调用对象在作用域链第二位,然后再外面的全局对象在第三位。理解JS作用域鏈?2012-04-18 09:53:53|??分类: /blog/js |字号?订阅 作用域链(Scope Chain)JavaScript中的一种重要机制,JS中所有的标识符(Identifier)都是通过Scope Chain来查找值的。script type=text/javascriptvar i = w i;/* 词法作用域(Lexical Scoping) JavaScript中的函数运行在它们被定义的作用域里,而不是它们被执行的作用域里. 这个作用域我们称之为[[scope]] 非内嵌函数的[[scope]]都是宿主对象,不同的宿主会有不同的内容*/var a =function(){ alert(i);}var b = function(){ var i = b i; a();}var c = function(){ a();}a();/* 函数在运行的时候,会先创建一个call Object, 将函数的形参、变量和函数申明的结果都添加到call Object作为属性; 把call Object添加到该函数的作用域链的最前面; 然后,再将函数定义时的[[scope]]添加到它的作用域链中; 函数体内的标识符查找 先从Scope Chain中第一个对象找,存在则返回,否则 继续查找下一个对象,存在则返回,否则(重复此步骤) 最后找不到则返回undefined*/b();c();/* JavaScript中的scope Chain的机制使得闭包得以实现*/var d = function(){ var i = d i; var e = function(){ alert(i); } return e;}var f = d();f();/* f是function e的引用 call Object部分:没有形参、变量申明和内部函数; [[scope]]部分:e定义在函数d体内,e的[[scope]]中可以访问到d,i,e,然后d也会有一个[[scope]],又可以接着往上访问,这样,便形成一条链*//script?具名函数表达式与匿名函数表达式和函数申明的区别 winter: 正常的函数定义时是直接把[[scope]]设为定义时的scope chain 但是具名函数表达式是先给scope chain加入一个new Object 之后再将[[scope]]设为新的

文档评论(0)

xy88118 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档