028-86261949

当前位置:首页 > 技术交流 > 我理解的 JavaScript 作用域

我理解的 JavaScript 作用域

2017/02/20 16:24 分类: 技术交流 浏览:9

作用域是JavaScript最重要的概念之一,对JavaScript的作用域有很深刻的了解是学好JavaScript的必经之路,任何程序设计语言都有作用域的概念,比如说Java,C#等语言里面是以“{}”来做划分的块级作用域,而在JavaScript是以函数为划分标准的称为函数作用域同时细分有全局作用域和局部作用域两种。下面源码时代Web前端培训讲师为大家介绍这两种作用域。

1.全局作用域

2.局部作用域  

和全局作用域相反,局部作用域一般只在固定的函数内可访问到(称函数作用域)。

例如我们上面的s_Name变量只能在g_do函数内访问,

3.为什么函数内部的变量外部无法访问,而最外层的外部变量函数内部能访问

在JavaScript中,函数也是对象,同时对象也是函数创建的,可以说JavaScript里一切皆对象,这个要记住。对于对象的属性JavaScript引擎提供了如何访问属性。

当函数运行时函数内部会创建一个内部属性是[[Scope]](ECMA-262标准第三版定义)该内部属性主要决定了哪些数据能被函数访问,当一个函数创建后,函数内部创建的[[Scope]]属性指向作用域链[[Scope chain]]作用域链中收集了函数外部所有的对象,最外层的函数无法收集内部函数的变量,而内部函数可以收集外层变量,这样就能解决我们如上的问题,更多细节我们接着往下看。

例如定义下面这样一个函数:

Demo:

在函数insert创建时,它的作用域链中会填入一个全局对象,该对象包含了所有全局变量,执行此函数时会创建一个称为“执行期上下文(execution context)”的对象,执行期上下文主要是函数执行时的运行环境。

每个执行期上下文都有自己的作用域链,函数的作用域链初始化为当前运行函数的[[Scope]]所包含的对象。 这些值按照它们出现在函数中的顺序被复制到运行期上下文的作用域链[[Scope]]中。它们共同组成了一个新的对象,叫“活动对象(activation object)”,该对象包含了函数的所有局部变量、形参数、以及this,然后此对象会被放入作用域链的最前端,当执行上下文被销毁,活动对象也会被销毁。

如下图:

通过如上的介绍,希望大家对函数作用域里面的[[Scope chain]]和 Activation Object,execution Context有一些了解。

#标签: JavaScript 作用域,H5前端,Web前端培训