🔖

スコープ外から変数にアクセスした場合の挙動

2024/09/29に公開

関数スコープ

userNameという関数の中に、変数が定義されています。
この場合、変数の有効範囲はuserNameという関数の中だけとなります。
よって、スコープ外から参照しようとしても、ReferenceErrorとなります

{}がバリア(壁)のような役割を果たしており、
スコープ外からアクセスできないようなイメージです。

補足

クラスのようにメンバ演算子を利用してみましたが、
undefinedでした(firstNameに代入されている"Ringo"を参照できなかった)

test.js
function userName(){
    let firstName = "Ringo";
    let lastName = "Sheena";

    return firstName + " - " + lastName;
}

console.log(userName().firstName);
//出力結果:undefined

console.log(userName.firstName);
//出力結果:undefined

クラススコープ

一方で、クラス内に定義されたメンバ変数には、
メンバ演算子(.)を使うことで参照することが可能です。

PIというメンバ変数(PIだから定数?)自体はCircleクラスの中で定義されていますが、
Circleクラス自体が呼び出し元と同じスコープで定義されているため、
Circle.PIという形式で呼び出すことが可能です。

クラス名自体はスコープ外(バリアの外)のため、
クラス名を経由すればバリア内の変数にアクセスできるイメージです。

クラス名を経由せず、
直でメンバ変数にアクセスすることはできません。(バリアに跳ね返される)

補足①

Circleクラスの外側にもう1枚{}というバリアを張ると、
呼び出している箇所から、
Circleというクラス名を経由することができなくなるので、
アクセスできません

補足②

クラス名の中からのアクセスであっても、
クラス名を経由する必要があります。

↓OK

test.js
class Circle {
    static PI = 3.14;
    static getPI(){
        console.log(Circle.PI);
    }
}

Circle.getPI();
// 出力結果:3.14

↓NG

test.js
class Circle {
    static PI = 3.14;
    static getPI(){
        console.log(PI);
   }
}

Circle.getPI();
// 出力結果:ReferenceError: PI is not defined

Discussion