杂七杂八广记系列 第九回 : Scope、Scope chain

大家好我是阿华,今天来跟大家聊聊Scope,作用域:

作用域 (Scope)

来自MDN说:

作用域是目前的执行上下文(Context),值和表达式在其中「可见」或可被存取。如果一个变数或表达式不在目前的作用域中,那么它是不可用的。作用域也可以构成层级结构,子作用域可以存取父作用域,反过来则不行。

而JavaScript 的作用域分为三种:

全域 (Global Scope):

当 JavaScript 程式码被执行一开始时,就会创建一个全域执行环境,被定义在函式或块级以外的变数,就会属于全局作用域,这些变数也被称之为全域变数 (Global variable),在程式码中的任何地方都能被使用到。以下例子的 a 值就是在全局作用域的全域变数。

var a = "全域作用域";function call() {  console.log(a); // 全域作用域  a = "全域作用域~~";}call();console.log(a); // 全域作用域~~

函数作用域 (Function Scope):

由函数所创建的作用域

function scope() {  let a = "函数作用域";  console.log(a); // 函数作用域}// a 在此处不可用,因为 a 是函数作用域,即便用var宣告亦然不可用,因为被var有函数作用域

块级作用域 (Block Scope):

ES6 之后才出现,被定义在一个块级中 {} ,
如下面例子,在 if else 判断式中,就属于块级作用域。要注意的是,只有 let 和 const 定义的变数会属于块级作用域,如果是 var 定义的变数会是只有函数作用域。

function checkScope() {  if (true) {    let a = "块级作用域";    var b = "函数作用域"; // var宣告,切分变数範围是function  } else {    // a 变数属于 if 判断式中的块级作用域,在此处不可用    // b 变数属于 check 函数的作用域,在此处可用    console.log(b); // 函数作用域  }  // a 在此处不可用,b 在此处可用}// a,b 在此处不可用

作用域链 (Scope Chain)

当 JavaScript 使用每一个变数的时候,会先尝试在当前作用域中寻找该变数,若在当前的作用域找不到该变数,会一直往父层作用域寻找,直到全局作用域还是没找到,就会直接报错,这一层一层的关係,连起来就是作用域链。让我们透过以下程式码来了解:

let a = 100;function find() {  // 在 find 函数作用域中没有变数 a,于是透过作用域链往父层寻找,  // 在这边的父层是全域,也就找到了 a 变数  console.log(a); // 100}find();

相信经过上面的整理与例子,大家能够初步的了解作用域(Scope)与作用域链 (Scope Chain)是什么,下回见搂~


关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章