[Day3] 作用域

作用域是原始码中定义变数的区域,他规范了目前程序码应该要去哪里查找变数,而作用域又可分为 静态作用域动态作用域,首先先来了解两者的差别。

静态作用域

定义

静态作用域又称作语法作用域(Lexical scoping),他在函数定义时就已经决定作用域,而且不会再改变,JavaScript 属於此类。

范例

以下为静态作用域范例,运作步骤如下:

  1. 先在全域命名一个 变数 num 赋予值 1。
  2. 呼叫 函式 fn2,在函式内命名一个 变数 num 赋予值 2,因静态作用域的关系,函式 fn2 中的 变数 num,作用域只在 函式 fn2 中,接着呼叫 函式 fn1
  3. 函式 fn1 内因没有 变数 num,又因静态作用域的关系,所以会向外层(全域)查找,故 console.log(num); 显示为 1
// 静态作用域范例

var num = 1;

function fn1() {
    console.log(num); // 1
    // 因静态作用域,又因 fn1 没有变数 num,所以会向外(全域)查找
}

function fn2() {
    var num = 2;
    //变数 num 作用域只在函式 fn2 中
    fn1();
}

fn2();

动态作用域

定义

动态作用域会在函式调用时才会决定作用域。

范例

以下为动态作用域范例,运作步骤如下:

  1. 先在全域命名一个 变数 num 赋予值 1。
  2. 呼叫 函式 fn2,在函式内命名一个 变数 num 赋予值 2,接着呼叫 函式 fn1
  3. 函式 fn1 内因没有 变数 num,又因动态作用域的关系 - 函式调用时才会决定作用域,所以会向上一层 函式 fn2 查找 变数 num,故 console.log(num); 显示为 2
// 动态作用域范例

var num = 1;

function fn1() {
    console.log(num); // 2
    // 因动态作用域,在函式调用时才会决定作用域,所以会向上一层 fn2 宣告的位置找变数的值
}

function fn2() {
    var num = 2;
    fn1();
}

fn2();

错误讯息

若所有作用域都找不到变数时,则会出现 ReferenceError: 变数 is not defined 的错误讯息,范例如下。

参考文献

六角学院 - JavaScript 核心篇


<<:  【Day3】看YT学写程序

>>:  Day18 Laravel - CRUD .feat RESTful API

[第十九只羊] 迷雾森林舞会XIII 设定form 绑定dom 同步房间(单押)

天亮了 前晚是1号玩家死亡 关於迷雾森林故事 反指标 洛神:2号玩家请继续发言 2号:1号是猎人他带...

排线相机 (续)

上次我们最後提到一些例子 -sh sharpness -100~100 -br brightness...

[Day 0] Reactive Programming 资料来源

资料来源 在学习过中曾参考许多文章与影片 reactivex Intro to Reactive P...

【PHP Telegram Bot】Day07 - 安装 VS Code 并撰写第一支程序

俗话说得好:「工欲善其事,必先利其器」。 没有一个好用的文字编辑器,要如何轻松愉悦的写程序呢? 安...

[DAY 19]bot在线状态通知

最近bot的更新量蛮大,有时候会关掉bot方便更新程序码 为了让频道上的人知道目前bot的状态,决定...