【Day03】语法作用域(Lexical scope)

今天要来介绍 JavaScript 的作用域,

JavaScript 是采用语法作用域(静态作用域)

首先我们先来看一个函式执行:

function callName() {
    var ming = '小明';
    console.log(ming);
}

callName();

此时显示的结果为 小明

但如果将 console.log() 放到函式外面时,

function callName() {
    var ming = '小明';
}

callName();

console.log(ming);

会显示 ReferenceError: ming is not defined

表示 ming 没有被定义,

为什麽会这样呢?

这就跟 JavaScript 的作用域有关系了

静态作用域和动态作用域

之前有说过 JavaScript 是直译式语言,是利用直译器来生成代码後运行,

而作用域在代码解析时,就已经确定作用域了,这就是语法作用域

也就是当我们在撰写程序码的时候,作用域就已经决定好了,

动态作用域是在调用函式的时候,才决定作用域。

以图形表示作用域决定位置:

将上图简单整理的话变成:

  1. 语法作用域(静态作用域)

    在语法解析时,就已经确定作用域,也就是当我们在程序码写好的时候,作用域就已经决定好了。

  2. 动态作用域

    在调用函式的时候,才决定作用域。

JavaScript 作用域

JavaScript 的作用域是一层一层包着的,每一个函式都是一个作用域,而最外层是全域

fn1 需要使用变数,但作用域内没有该变数时,会向外查找

当外层该变数时会直接使用,

当外层没有该变数时,会显示 ReferenceError: xxx is not defined

接下来我们看一个范例:

var value = 1;

function fn1() {
    console.log(value);
}

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

fn2();

该范例显示结果为 1

图解:

此时 fn1 内没有 value 这个变数,所以会向外查找,

而 JavaScript 的作用域为语法作用域

因此 fn1 的外层为全域,而不是 fn2,所以 value 会指向全域中的值 1

但如果是动态作用域的话,那结果会显示 2

PS:这只是举例动态作用域会显示的结果而已,JavaScript 中这程序码不管执行几次都只会显示 1

因为 fn1fn2 调用时,fn1 外层的作用域会变成 fn2 的作用域,因此 value 会指向 fn2 中的值 2

以上就是关於作用域的部分了,明天说明执行环境与执行堆叠的部分。


<<:  Day3 差点难产的CSS

>>:  Day-2 既然要在新电视上玩游戏机、当然要从认识 HDMI 开始

[2021铁人赛 Day29] Binary Exploitation (Pwn) Pwn题目 01

引言 昨天介绍了 pwntools 这个好用工具的基本使用方式, 有了这几个函式,其实就已经可以对...

Day14:全端工程师的工作内容?(上)

一、前言   因为我待的是较小型的接案公司,基本上全端工程师的工作几乎全包,从投标、接案、访谈客户需...

!不只是问卷!要来考验iT专家们对於永续的了解程度【来自世新大学资讯传播学系108级策展组】

★永续之路很漫长,热爱地球从我做起 你也许常看到这些标语、广告: 海龟鼻子正在插着吸管受苦,人类正用...

[Day10] ST01感测扩充板-(介绍)

1.前言 今天主要介绍我们後续系列案例所会使用到的ST01扩充板,在开始前稍微说明这篇可能比较偏工商...

WebRTC一对一视频通话(Flutter+React+Go+WebRTC方案)

WebRTC技术经过多年的发展,已经非常成熟,它提供了HTML5流媒体技术的一整套解决方案及API,...