这几天学习了一下javascript作用域链,感到这个挺重要的,所以写一篇文章分享一下:
1. 作用域链:
当代码在一个环境中执行时,会创建由变量对象构成的一个作用域链。作用域链的用途是:保证对执行环境有权访问的所有变量和函数的有序访问。
2. 在作用域链中查找标识符:
当在某环境中为了读取或写入而引用一个标识符时,必须通过搜索来确定该标识符实际代表什么。搜索过程从作用域链的前端开始,向上逐级查询与给定名字匹配的 标识符。如果在局部环境中找到该标识符,搜索过程停止,变量就绪。如果在局部环境中没有找到该变量名,则继续沿作用域链向上搜索。搜索过程将一直追溯到全 局环境的变量对象。如果在全局环境中也没有找到这个标识符,则意味着这个标识符为声明。
当执行流进入一个函数中,函数的环境就会被推入一个环境栈中,而在函数执行后,栈将其环境弹出,把控制权返回给之前的执行环境。
3. 现在就来看看例子吧。。。
3.1 var name = "hello"; function test(){ alert(name); //undefined var name = "world"; alert(name); //world } test();
分析: 首先函数test()的作用域链包含两个对象:他自己的变量对象和全局的变量对象。在全局变量对象(即就是Window对象)中存在 name=“hello”和Window对象自身所持有的一些属性,全局作用域被放在作用域链的最末端。现在来说说test自身的变量对象,有 alert,name,alert这三个变量,因为test函数还没有执行所以此时的name属性的值就是undefined,因此当解析到
alert(name);
//undefined
这一句话的时候,js引擎会在自身的对象作用域中找到name属性,并且输出他的值(undefined),当执行到var
name =
"world"
;
时name属性的值已经被赋值为world了因此下一条alert就打印出world了!
3.2 var name = "hello"; function test(){ alert(name); //hello name = "world"; alert(name); //world } test();
分析: 此时也和上面的一样,都有两个作用域对象,Window作用域对象和上面分析的一样(name=hello),现在来分析分析test的作用域:因为在 js中存在预编译的过程,即就是:js在执行每一段js代码之前,都会首先处理var关键字和function定义式。但因为此时的test内部没有 var声明的变量,所以此时name属性没有在test这个作用域里面,这里要说一句:在使用var关键字声明的变量时,这个变量将被自动添加到距离最近 的可用环境中,对于函数而言,这个最近的环境就是函数的局部环境。如果变量在未经声明的时候被初始化,那么该变量会自动被添加到全局环境。因此name现 在已经被为全局作用域对象中的属性了。但是其值依旧还是hello,因为还没有执行到name =
"world"
;
因此当第一条alert(name);
//hello
时候会在全局环境变量中查找到hello的值,当执行了
name =
"world"
;
全局变量中的name就被赋值为world了,因此在进行alert(name);
//world
的时候就是world了。
3.3 name = "hello"; function test(){ alert(name); //undefined ---》》》在自己的作用域中查找到的 var name = "world"; alert(name); //world } test(); name = "hello"; function test(){ alert(name); //hello name = "world"; alert(name); //world } test();
接下来这两种情况出现的值就很好分析了。。。
补充:
在web浏览器中,全局执行环境被认为是Window对象,因此所有的全局变量和函数都是作为Window对象的属性和方法创建的,某个执行环境中的所有 代码执行完毕后该环境被销毁,保存在其中的所有变量和函数定义也随之销毁。全局执行环境知道应用程序退出-----例如关闭浏览器或者网页时才会销 毁!!!
相关推荐
### JavaScript作用域链(Scope Chain)初探 #### 一、引言 JavaScript的作用域链是一个重要的概念,尤其是在深入理解JavaScript执行机制时不可或缺的一部分。本文将通过对几个具体例子的分析来探讨JavaScript作用域...
JavaScript中的作用域链是理解变量查找和闭包的关键概念。作用域链主要涉及到函数执行上下文和全局执行上下文中的作用域。以下是对这个主题的详细解释: 首先,每个函数在创建时,都会有一个内部属性[[scope]],它...
深入理解JavaScript作用域和作用域链对于编写高效、无错的代码至关重要。正确管理作用域可以避免全局变量冲突,提高代码的复用性和模块化,同时也有助于提升性能,因为局部变量的访问速度通常比全局变量快。在实际...
JavaScript的作用域链是理解JavaScript执行环境的关键概念,它决定了变量和函数的可访问性。在JavaScript中,每个函数都有自己的作用域,而这些作用域按照特定的顺序组织起来,形成了作用域链。这个链帮助解析器在...
JavaScript 作用域链是 JavaScript 语言中一个至关重要的概念,它决定了变量和函数的访问权限。在 JavaScript 中,每个函数都有自己的作用域,也就是变量和函数的可见范围。当一个函数被创建时,它会形成一个作用域...
scope-chains-closures, Javascript作用域链和闭包 workshop 范围链和闭包 workshop正在启动$ npm install -g scope-chains-closures$ scope-chains-closures # or, shorter: sccjs使用箭头
JavaScript中的作用域链是编程中一个至关重要的概念,它决定了变量和函数的可访问性以及在不同作用域内的查找顺序。在深入理解作用域链之前,我们首先要了解什么是执行环境和变量对象。 执行环境,简单来说,就是...
在深入探讨JavaScript作用域链解析之前,首先需要明确几个关键概念:作用域(Scope)、作用域链(Scopechain)、执行上下文(Executecontext)、活动对象(ActiveObject)、动态作用域(Dynamic Scope)以及闭包...
JavaScript作用域链是编程语言中一个关键的概念,它在JavaScript中扮演着至关重要的角色,尤其对于变量的查找和管理有着深远的影响。理解作用域链有助于我们编写更清晰、更安全的代码,避免出现意外的变量污染和作用...
作用域是JavaScript最重要的概念之一,想要学好JavaScript就需要理解JavaScript作用域和作用域链的工作原理。今天这篇文章对JavaScript作用域和作用域链作简单的介绍,希望能帮助大家更好的学习JavaScript。任何程序...
在JavaScript编程中,作用域和作用域链是影响程序性能的关键因素之一。优化作用域链是提高JavaScript代码执行效率的重要手段。下面我们从多个方面来详细探讨作用域链的概念、作用域链的层级关系、变量访问的性能影响...
JavaScript 变量作用域是基于其特有的作用域链的。在 JavaScript 中,变量作用域是指变量可以被访问和修改的范围。 JavaScript 没有块级作用域,而是基于函数作用域和全局作用域的。 首先,看看 JavaScript 的作用...
JavaScript作用域链是JavaScript语言中一个关键的概念,它关乎变量和函数查找的顺序以及作用域内的数据访问。本文将深入探讨这一主题,并结合实例进行详细解释。 首先,我们需要理解作用域的基本概念。在JavaScript...
JavaScript 采用词法作用域(lexical scoping),函数执行依赖的变量作用域是由函数定义的时候决定,而不是函数执行的时候决定,通过本文给大家介绍JavaScript作用域链、执行上下文与闭包相关知识,感兴趣的朋友一起...
JavaScript中的闭包、匿名函数和作用域链是编程中至关重要的概念,它们是理解JavaScript运行机制的关键。在本文中,我们将深入探讨这三个概念,并通过实际示例来展示它们的运用。 首先,我们来讨论“闭包”。闭包是...
在深入探讨JavaScript作用域链之前,首先需要了解作用域的概念。在编程语言中,作用域定义了变量和函数的可访问范围,即这些变量和函数在哪些区域中可见,以及它们的生命周期如何。JavaScript中的作用域分为两种:...
JavaScript中的作用域链是理解JS变量访问规则的关键概念。它涉及到变量、函数、作用域以及它们之间的关系。本文将深入探讨JS作用域链的工作原理及其重要性。 首先,我们需要了解什么是作用域。在JavaScript中,作用...