`
荷戟者
  • 浏览: 280126 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

js函数的执行环境和作用域链的深入解析

    博客分类:
  • JS
 
阅读更多

摘自:http://www.cnblogs.com/return/archive/2009/10/31/1593411.html

 

在js中对象的外在表现形式为函数。

第一步. 定义后:每个已定义函数,都有一个内在属性[scope],其对应一个对象的列表,列表中的对象仅能内部访问。

例如:建立一个全局函数A,那么A的[Scope]内部属性中只包含一个全局对象(Global Object),而如果我们在A中创建一个新的函数B,那么B的[Scope]属性中就包含两个对象,函数A的Activation Object对象在前面,全局对象(Global Object)排在后面。

简而言之,一个函数的[Scope]属性中对象列表的顺序是上一层函数的Activation Object对象,然后是上上层的,一直到最外层的全局对象。

第二步.执行时:当一个函数被执行的时候,会自动创建一个可以执行的对象(Execution Object),并同时绑定一个作用域链(Scope Chain)。作用域链会通过下面两个步骤来建立,用于进行标识符解析。

  1. 首先,将函数对象[Scope]内部属性中的对象,按顺序复制到作用域链Scope Chain中。
  2. 其次,在函数执行时,会创建一个新的Activation Object对象,这个对象中包含了this、参数(arguments)、局部变量(包括命名的参数)的定义,这个Activation Object对象会被置于作用域链的最前面。

所以在Scope Chain中最后顺序是本函数的Activation Object,然后是上层函数的Activation Object,再上上层的Activation Object,一直到Global Object。


当执行js代码的过程中,遇到一个标识符,就会根据标识符的名称,在执行上下文(Execution Context)的作用域链中进行搜索。从作用域链的第一个对象(该函数的Activation Object对象)开始,如果没有找到,就搜索作用域链中的下一个对象,如此往复,直到找到了标识符的定义。如果在搜索完作用域中的最后一个对象,也就是全局对象(Global Object)以后也没有找到,则会抛出一个错误,提示undefined。

 

由此而来的建议

1. 尽量使用局部变量,这不仅仅是涉及到私有属性的问题,局部的变量从以上过程中可以看到,能够减少搜索的时间(注:在一般的情况下,不包括浏览器的优化行为)。

2. 避免使用with语句。因为它会修改执行上下文(Execution Context)的作用域链,在最前面添加一个对象(Variable Object)。同理,对于try-catch语句中的catch语句块也类似。

分享到:
评论

相关推荐

    深入理解JavaScript作用域和作用域链

    当函数执行完毕,活动对象会被销毁,但其后的链仍然保留,直到整个作用域链所属的执行环境结束。 在处理函数内部的变量时,JavaScript会遵循作用域链来查找变量。如果在当前作用域找不到变量,就会沿着作用域链向上...

    js 函数的执行环境和作用域链的深入解析

    ### JavaScript函数的执行环境与作用域链深入解析 #### 一、引言 JavaScript作为一种广泛应用于Web开发的语言,其灵活性和动态性深受开发者喜爱。在JavaScript中,理解函数的执行环境和作用域链是非常重要的,这...

    JavaScript作用域与作用域链深入解析

    作用域链是JavaScript执行环境的另一个核心概念。它是一种内部机制,用于标识符解析。作用域链由多个作用域组成,每个作用域都会为变量和函数提供一个查找上下文。当JavaScript引擎在执行函数时,会创建一个称为执行...

    第八课 执行环境与作用域-011

    JavaScript编程语言中,...理解执行环境和作用域,能帮助开发者更好地管理变量和函数,避免命名冲突,以及提高代码的可维护性和性能。在前端开发中,深入掌握这些概念至关重要,因为它们直接影响到代码的正确性和效率。

    JavaScript — 原型链与作用域链1

    1. **作用域生成**:每次JavaScript代码执行时,都会为当前执行环境(全局、函数或块级)创建一个新的作用域。这个作用域包含了在这个环境中声明的所有变量。 2. **变量活性**:在作用域内声明的变量会自动成为该...

    深入Javascript函数、递归与闭包(执行环境、变量对象与作用域链)使用详解

    本文将深入探讨JavaScript中的函数、递归和闭包,以及执行环境、变量对象与作用域链的概念。 首先,我们来看JavaScript中定义函数的两种方式:函数声明和函数表达式。函数声明是一种明确的、独立的代码结构,例如`...

    深入了解JavaScript,从作用域链开始(1).pdf

    局部作用域,或称函数作用域,只在函数内部有效。这意味着在函数外部无法访问在函数内部定义的变量。例如,如果在函数`hello()`中声明了一个变量`a`,则只有在该函数内部才能访问到`a`。 理解作用域链的关键在于...

    Javascript作用域和作用域链原理解析

    2. 函数作用域(局部作用域):在函数内部声明的变量仅在该函数内部可访问。例如: ```javascript function myFunc() { var localVar = 'Hello Local'; console.log(localVar); // 可以访问 } console.log...

    第六章:js解析顺序和作用域1

    在JavaScript中,代码的解析分为两个主要阶段:定义阶段和执行阶段。 一、JavaScript解析顺序 1. 定义阶段: 在这个阶段,JavaScript引擎首先会处理`var`声明的变量、函数定义以及函数参数。这个过程称为变量提升...

    深入理解变量作用域

    - 闭包是指有权访问另一个函数作用域中的变量的函数。创建闭包最常见的方法是函数嵌套。 - 闭包使得函数可以访问并操作外部函数中的变量,即使外部函数已经返回。 - 闭包对于保持数据私密性和实现模块化非常有用...

    javascript作用域链(Scope Chain)初探.docx

    JavaScript的作用域链是一个重要的概念,尤其是在深入理解JavaScript执行机制时不可或缺的一部分。本文将通过对几个具体例子的分析来探讨JavaScript作用域链的基本原理及其工作方式。 #### 二、从一个简单的问题...

    JavaScript程序设计-变量作用域.pdf

    JavaScript引擎在执行代码之前会进行预解析,这个过程中会将变量和函数的声明提升到它们所在作用域的顶部,但不包括赋值操作。这意味着,即使在变量声明之前使用,也不会报错,但变量的值会是`undefined`。函数声明...

    js作用域和作用域链及预解析

    在JavaScript编程中,作用域是一个非常核心的概念,它决定了变量和函数的可访问性和生命周期。作用域链和预解析是作用域相关的两个重要...正确的使用变量和函数作用域可以避免很多常见的错误,并提高代码的执行效率。

    JavaScript 作用域链解析

    执行上下文和活动对象都是动态概念,它们是在函数运行时创建的,而执行上下文的作用域链是由函数作用域链初始化的。 在讨论动态作用域时,JavaScript通过with语句、try-catch的catch子句以及eval方法改变执行上下文...

    JSFunction函数深入解析.pdf

    在这个深入解析中,我们将探讨`Function`的一些关键特性和用法,包括函数的定义方式、返回值、执行环境、作用域、闭包以及上下文。 1. **函数定义** - **函数声明**:`function sum(num1, num2) { return num1 + ...

    深入理解JavaScript作用域共12页.pdf.zip

    在全局和函数作用域中,`this`通常指向全局对象(在浏览器中是`window`),而在方法中,`this`指向调用该方法的对象。 10. **箭头函数与作用域**:箭头函数不创建自己的`this`,它会继承自父作用域的`this`值。这...

Global site tag (gtag.js) - Google Analytics