深化理解javascript作用域其次篇之词法作用域和动态作用域_

深化理解javascript作用域其次篇之词法作用域和动态作用域_

ID:63511002

大小:13.65 KB

页数:6页

时间:2021-08-24

深化理解javascript作用域其次篇之词法作用域和动态作用域__第1页
深化理解javascript作用域其次篇之词法作用域和动态作用域__第2页
深化理解javascript作用域其次篇之词法作用域和动态作用域__第3页
深化理解javascript作用域其次篇之词法作用域和动态作用域__第4页
深化理解javascript作用域其次篇之词法作用域和动态作用域__第5页
深化理解javascript作用域其次篇之词法作用域和动态作用域__第6页
资源描述:

《深化理解javascript作用域其次篇之词法作用域和动态作用域_》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库

1、深化理解javascript作用域其次篇之词法作用域和动态作用域_这篇文章主要介绍了javascript作用域其次篇之词法作用域和动态作用域的相关资料,特别不错,具有参考借鉴价值,感爱好的伴侣可以参考下前面的话大多数时候,我们对作用域产生混乱的主要缘由是分不清晰应当根据函数位置的嵌套挨次,还是根据函数的调用挨次进行变量查找。再加上this机制的干扰,使得变量查找极易出错。这事实上是由两种作用域工作模型导致的,作用域分为词法作用域和动态作用域,分清这两种作用域模型就能够对变量查找过程有清楚的认识。本文是深化理解javascript作用域系列其次篇——词法作用域和动态作

2、用域词法作用域第一篇介绍过,编译器的第一个工作阶段叫作分词,就是把由字符组成的字符串分解成词法单元。这个概念是理解词法作用域的基础简洁地说,词法作用域就是定义在词法阶段的作用域,是由写代码时将变量和块作用域写在哪里来决定的,因此当词法分析器处理代码时会保持作用域不变关系无论函数在哪里被调用,也无论它如何被调用,它的词法作用域都只由函数被声明时所处的位置决定functionfoo(a){varb=a*2;functionbar(c){console.log(a,b,c);}bar(b*3);}foo(2);//2412在这个例子中有三个逐级嵌套的作用域。为了关心理解,

3、可以将它们想象成几个逐级包含的气泡作用域气泡由其对应的作用域块代码写在哪里决定,它们是逐级包含的气泡1包含着整个全局作用域,其中只有一个标识符:foo气泡2包含着foo所创建的作用域,其中有三个标识符:a、bar和b气泡3包含着bar所创建的作用域,其中只有一个标识符:c查找作用域气泡的结构和相互之间的位置关系给引擎供应了足够的位置信息,引擎用这些信息来查找标识符的位置在代码片段中,引擎执行console.log(...)声明,并查找a、b和c三个变量的引用。它首先从最内部的作用域,也就是bar(...)函数的作用域开头查找。引擎无法在这里找到a,因此会去上一级到所

4、嵌套的foo(...)的作用域中连续查找。在这里找到了a,因此引擎用法了这个引用。对b来讲也一样。而对c来说,引擎在bar(...)中找到了它[留意]词法作用域查找只会查找一级标识符,假如代码引用了foo.bar.baz,词法作用域查找只会试图查找foo标识符,找到这个变量后,对象属性访问规章分别接管对bar和baz属性的访问foo={bar:{baz:1}};console.log(foo.bar.baz);//1遮挡???作用域查找从运行时所处的最内部作用域开头,逐级向外或者说向上进行,直到遇见第一个匹配的标识符为止在多层的嵌套作用域中可以定义同名的标识符,这叫

5、作“遮挡???效应”,内部的标识符“遮挡???”了外部的标识符vara=0;functiontest(){vara=1;console.log(a);//1}test();全局变量会自动为全局对象的属性,因此可以不挺直通过全局对象的词法名称,而是间接地通过对全局对象属性的引用来对其进行访问vara=0;functiontest(){vara=1;console.log(window.a);//0}test();通过这种技术可以访问那些被同名变量所遮挡???的全局变量。但非全局的变量假如被遮挡???了,无论如何都无法被访问到动态作用域javascript用法的是词法作

6、用域,它的最重要的特征是它的定义过程发生在代码的书写阶段那为什么要介绍动态作用域呢?事实上动态作用域是javascript另一个重要机制this的表亲。作用域混乱多数是由于词法作用域和this机制相混淆,傻傻分不清晰动态作用域并不关怀函数和作用域是如何声明以及在任何处声明的,只关怀它们从何处调用。换句话说,作用域链是基于调用栈的,而不是代码中的作用域嵌套vara=2;functionfoo(){console.log(a);}functionbar(){vara=3;foo();}bar();【1】假如处于词法作用域,也就是现在的javascript环境。变量a首先

7、在foo()函数中查找,没有找到。于是顺着作用域链到全局作用域中查找,找到并赋值为2。所以掌握台输出2【2】假如处于动态作用域,同样地,变量a首先在foo()中查找,没有找到。这里会顺着调用栈在调用foo()函数的地方,也就是bar()函数中查找,找到并赋值为3。所以掌握台输出3小结:两种作用域的区分,简而言之,词法作用域是在定义时确定的,而动态作用域是在运行时确定的以上所述是我给大家介绍的深化理解javascript作用域其次篇之词法作用域和动态作用域,盼望对大家有所关心...

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

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

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