1. 程式人生 > 其它 >作用域、回撥函式和遞迴

作用域、回撥函式和遞迴

作用域

  1. 在函式中使用var定義的變數或者函式的形參,都是區域性變數,也就是說這個變數只能作用域函式內部,函式執行完成後這個變數會被銷燬,在函式外是不存在該變數的

  2. 使用var定義在函式外的變數,可以在函式內被呼叫,定義在函式外的變數叫做全域性變數,函式執行完成後不會銷燬全域性變數

  3. 函式內也可以定義函式,所以函式內定義的函式也是區域性函式,只能在函式內呼叫

  4. 全域性變數

var a=1;
function fn(){
    a++;
}
fn();
console.log(a);
  1. 區域性變數
function fn(){
      var a=1;
      a++;
      return a;
  }
   var b=fn();
  console.log(b);
 引數也是區域性變數

```JS
  function fn(a){
            a++;
    }
        var b=1;
        這裡是把b的值傳入,並不是改變了b
        fn(b);
        函式引數在函式外是無法獲取的
        console.log(b);
```
  1. 在函式中也和全域性變數的變數一樣,當函式被呼叫時,函式內的區域性變數就會被預解析,在棧中開闢一個空間,並起名為這個區域性變數名稱,但是沒有賦值,等執行到賦值時才賦值,棧中開闢空間的地方和全域性變數開闢空間的地方不同,全域性變數開闢空間實在最外層,區域性變數開闢的棧中空間時從屬於當前這個函式的內部空間

  2. 兩個函式中的區域性變數是沒有任何關係的

      function fn(){
        var a=1;
        a++;
         }
         function fn1(){
        var a=2;
        a++;
    }
     function fn(){
        console.log(a);//undefined
        var a=3;
    }
    fn();
     function fn(){
        console.log(a);//報錯
    }
    fn();
    
  3. 如果函式中有與全域性變數同名的區域性變數時,這個函式內所有的變數都是區域性變數,無法呼叫到全域性變數

      var a=1;
        function a(a){
        if(a===undefined){
            a=5;
        }else if(a===2){
            a++;
        }else{
            var a=10;
        }
        console.log(a);
    }
        a(2);
    
  4. 這裡a是全域性變數,首先預解析時,他就是一個函式a,但是當執行到a=1時,就會覆蓋函式,於是a=1,a(1) 因為a不是函式,而是1,這時候就會報錯a不是一個函式

     var a;  
        function a(a){
        if(a===undefined){
            a=5;
        }else if(a===2){
            a++;
        }else{
            var a=10;
        }
        console.log(a);
        }
    a(2);
        a=2;
    
  5. 區域性變數因為定義在函式內,也就是說只有函式執行時才會重新定義並且使用,函式執行完成後會被銷燬隱居區域性變數無法長期儲存下來,以後呼叫時無法呼叫的,如果希望以後也可以使用這個變數,需要把這個變數return返回函式儲存為全域性變數

回撥函式和遞迴

回撥函式

定義:在一個函式中,傳入的實參是另外一個,在這個函式中執行實參的這個函式

在1000毫秒後僅執行一次這個回撥函式

 setTimeout(function(){
    },1000);

每間隔1000毫秒執行一次這個回撥函式

 setInterval(function(){
console.log("aaa");
        },1000);

使用回撥函式的目的,是為了解決先執行完某個操作運算之後在執行當前這個函式,或者在觸發某個內容時再執行這個函式

遞迴

function fn(){
      fn();
    }
    fn();

定義:當前函式自身內部執行自己,不斷的重複

Maximum call stack size exceeded 堆疊上限溢

遞迴需要一個條件來結束遞迴,或者在不滿足條件時不進入遞迴