做用域的幾個概念:javascript
一、JavaScript中的函數運行在它們被定義的做用域裏,而不是它們被執行的做用域裏.java
二、全局變量擁有全局做用域,函數內聲明的變量只在函數體內有定義,做用域是局部性的。函數
三、 在函數體內,局部變量的優先級高於全局變量。spa
四、 定義全局變量的時候能夠不須要var進行聲明,定義局部變量的時候必須用var進行聲明 。(一般狀況下建議都用var聲明)3d
做用域容易遇到的幾個誤區:blog
1:全局變量和局部變量做用域混淆。(新手誤區)ip
圖 1 圖 2作用域
如圖1和圖2,當局部變量和全局變量重複時,局部變量優先級高於全局變量,圖1中checkscope()方法中對scope用var從新進行了聲明,所以改變和返回的是從新聲明的局部變量scope。而圖2中沒有從新聲明,所以checkscope()方法中改變和返回的是全局變量scope。io
2:忽略變量提高的做用。console
圖 3
如圖3所示,第一次輸出的不是理想中的"global",反而是undefined;這是由於在javascript中局部變量在函數體內始終是有定義的,函數體內的變量聲明默認都提高到函數頂部,即checkscope()方法中實際執行順序是:
function checkscope() {
var scope;
console.log(scope);
scope = "local";
console.log(scope);
}
3:使用var聲明全局變量和不使用var聲明全局變量。