作用域、回撥函式和遞迴
作用域
-
在函式中使用var定義的變數或者函式的形參,都是區域性變數,也就是說這個變數只能作用域函式內部,函式執行完成後這個變數會被銷燬,在函式外是不存在該變數的
-
使用var定義在函式外的變數,可以在函式內被呼叫,定義在函式外的變數叫做全域性變數,函式執行完成後不會銷燬全域性變數
-
函式內也可以定義函式,所以函式內定義的函式也是區域性函式,只能在函式內呼叫
-
全域性變數
var a=1;
function fn(){
a++;
}
fn();
console.log(a);
- 區域性變數
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);
```
-
在函式中也和全域性變數的變數一樣,當函式被呼叫時,函式內的區域性變數就會被預解析,在棧中開闢一個空間,並起名為這個區域性變數名稱,但是沒有賦值,等執行到賦值時才賦值,棧中開闢空間的地方和全域性變數開闢空間的地方不同,全域性變數開闢空間實在最外層,區域性變數開闢的棧中空間時從屬於當前這個函式的內部空間
-
兩個函式中的區域性變數是沒有任何關係的
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();
-
如果函式中有與全域性變數同名的區域性變數時,這個函式內所有的變數都是區域性變數,無法呼叫到全域性變數
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);
-
這裡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;
-
區域性變數因為定義在函式內,也就是說只有函式執行時才會重新定義並且使用,函式執行完成後會被銷燬隱居區域性變數無法長期儲存下來,以後呼叫時無法呼叫的,如果希望以後也可以使用這個變數,需要把這個變數return返回函式儲存為全域性變數
回撥函式和遞迴
回撥函式
定義:在一個函式中,傳入的實參是另外一個,在這個函式中執行實參的這個函式
在1000毫秒後僅執行一次這個回撥函式
setTimeout(function(){
},1000);
每間隔1000毫秒執行一次這個回撥函式
setInterval(function(){
console.log("aaa");
},1000);
使用回撥函式的目的,是為了解決先執行完某個操作運算之後在執行當前這個函式,或者在觸發某個內容時再執行這個函式
遞迴
function fn(){
fn();
}
fn();
定義:當前函式自身內部執行自己,不斷的重複
Maximum call stack size exceeded 堆疊上限溢
出
遞迴需要一個條件來結束遞迴,或者在不滿足條件時不進入遞迴