2018-04-11

JavaScript作用域链浅析

1、作用域

作用域指的是变量存在的范围。在ES5规范中,JavaScript只有两种作用域:

  • 全局作用域,变量在整个程序中始终存在,所有地方均可读取;
  • 函数作用域,变量只在函数内部存在。

函数外部声明的变量就是“全局变量”,可以在函数内部读取;


在函数内部定义的变量称为“局部变量”,外部不能读取。


函数内部的局部变量会覆盖同名全局变量。


2、作用域链

当代码在一个环境中执行时,会创建变量对象的一个作用域链。作用域链的用途是保证对执行环境有权访问的所有变量和函数的有序访问。
我们来看下面这段代码:

  var a = 2
  function fn1(){
    console.log(a);
  }
fn1();

当某个函数第一次被调用时,就会创建一个执行环境(execution context)以及相应的作用域链。当调用fn1()时的作用域链如下:

  • 函数在执行的过程中,先从自己内部找变量
  • 如果找不到,再从创建当前函数所在的作用域去找, 以此往上

可以看到fn1内没有变量a,于是沿着作用域链向后寻找,最后找到全局变量a,所以返回了全局变量a的值。

标识符解析是沿着作用域链一级一级地搜索标识符地过程。搜索过程始终从作用域链地前端开始,然后逐级向后回溯,直到找到标识符为止(如果找不到标识符,通常会导致错误发生)—-《JavaScript高级程序设计》

本文仅为自已当前学习的简单理解,如需深入了解请参考其它文章。


参考:
http://javascript.ruanyifeng.com/grammar/function.html#toc11
https://blog.csdn.net/whd526/article/details/70990994

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 第2章 基本语法 2.1 概述 基本句法和变量 语句 JavaScript程序的执行单位为行(line),也就是一...
    悟名先生阅读 9,698评论 0 13
  • 第3章 基本概念 3.1 语法 3.2 关键字和保留字 3.3 变量 3.4 数据类型 5种简单数据类型:Unde...
    RickCole阅读 10,641评论 0 21
  • 函数和对象 1、函数 1.1 函数概述 函数对于任何一门语言来说都是核心的概念。通过函数可以封装任意多条语句,而且...
    道无虚阅读 10,147评论 0 5
  • 一天,一同事急匆匆的跑来诉说电脑无法开机,但急需电脑里面的客户资料,问我如何拷贝出来?我去看了下,发现电脑故障提示...
    SaveUTime阅读 8,062评论 0 2
  • 请不要介意我还在想你 我不会把爱情当成游戏 请不要介意我让游戏结局 不让你输 不让你输 对爱情的期盼开出了一朵花 ...
    导演张升志阅读 968评论 0 0