1. 程式人生 > 其它 >2.C++中的智慧指標

2.C++中的智慧指標

作用域(scope)規定了變數能夠被訪問的“範圍”,離開了這個“範圍”變數便不能被訪問

區域性作用域

函式作用域

在函式內部宣告的變數只能在函式內部被訪問,外部無法直接訪問。

總結:

  1. 函式內部宣告的變數,在函式外部無法被訪問
  2. 函式的引數也是函式內部的區域性變數
  3. 不同函式內部宣告的變數無法互相訪問
  4. 函式執行完畢後,函式內部的變數實際被清空了
    // 形參也是區域性變數
    function f1(n) {
      const num = 1
      console.log(num,n)
    }

    f1(2)

塊作用域

在 JavaScript 中使用 { } 包裹的程式碼稱為程式碼塊,程式碼塊內部宣告的變數外部將【有可能】無法被訪問。

總結:

  1. let 宣告的變數會產生塊作用域,var 不會產生塊作用域
  2. const 宣告的常量也會產生塊作用域
  3. 不同程式碼塊之間的變數無法互相訪問
  4. 推薦使用 let 或 const
    if(true) {
      const num = 1
      console.log(num//1
    }

    for (let i = 0; i < 5; i++) {
      const num = 2
      console.log(num)//2
    }

    {
      const num = 3
      console.log(num)//3
    }

    // let const 具有塊級
    // var 不具有塊級

    {
     var  num = 4
    }

    console.log(num)//4

全域性作用域

script標籤和.js檔案的【最外層】就是所謂的全域性作用域,在此宣告的變數在函式內部也可以被訪問

全域性作用域:函式或者塊級外面。在全域性宣告的變數,稱為全域性變數

全域性作用域中宣告的變數,任何其它作用域都可以被訪問

    let n = 123

    function fn() {
      n = 666
      console.log(n)//666
    }

    console.log(n)//123

    fn()

    console.log(n)//666

    {
      n = 999
      console.log(n)//999
    }

    console.log(n)//999

注意:如果不加關鍵字宣告,預設為全域性變數

    // 如果不加關鍵字宣告,預設為全域性
    num1 = 1

    {
      num2 = 2 
    }

    if (true) {
      num3 = 3
    }

    function f () {
      num4 = 4
    }
    f ()

    console.log(num1,num2,num3,num4)//1 2 3 4

作用域鏈

作用域鏈本質上是底層的變數查詢機制

  • 在函式被執行時,會優先查詢當前函式作用域中查詢變數
  • 如果當前作用域查詢不到則會依次逐級查詢父級作用域直到全域性作用域

總結:

  1. 巢狀關係的作用域串聯起來形成了作用域鏈

  2. 相同作用域鏈中按著從小到大的規則查詢變數(就近原則)

  3. 子作用域能夠訪問父作用域,父級作用域無法訪問子級作用域

    // 函式呼叫才會執行
    // 作用域:就近原則
    const n = 333

    function f1 () {
      const n = 666
      function f2 () {
        //報錯 Uncaught ReferenceError: Cannot access 'n' before initialization
        // console.log(n)
        const n= 999
        function f3 () {
          console.log(n)//999
        }
        f3()
        console.log(n)//999
      }
      f2()
      console.log(n)//666
    }

    f1()
    console.log(n)//333