javascript函數做用域鏈之詞法做用域

在開發語言中常見的做用域規則有  塊級做用域和詞法做用域函數

做用域 顧名思義就是起做用的區域  定義一變量後 ,能夠在此範圍做用的區域spa

1、塊級做用域就是用一個塊結構分割變量的訪問區域  塊即{ } 表明語言有C 系列語言code

2、詞法做用域就是變量的做用範圍,簡言之詞法做用域與代碼的編寫有關於執行無關,函數內部容許訪問函數外部的變量對象

特色:分割做用域只有函數blog

變量名提高ip

函數名提高作用域

函數的聲明比變量的聲明優先級高開發

function a(){     
}  
var a;  
alert(a);//打印出a的函數體  
  
var a;  
function a(){     
}  
alert(a);//打印出a的函數體  

//可是要注意區分和下面兩個寫法的區別:   
var a=1;  
function a(){     
}  
alert(a);//打印出1  
  
<script>  
function a(){     
}   
var a=1;  
alert(a);//打印出1  
    function test() {  
    
    bar(); // 2  
    var foo = function () { // 變量指向函數表達式  
        console.log("1");  
    }  
    function bar() { // 函數聲明 函數名爲bar  
        console.log("2");  
    } 
    foo();//1
}  
test(); 

可是
    function test() {  
    foo();//報錯
    bar();   
    var foo = function () { // 變量指向函數表達式  
        console.log("1");  
    }  
    function bar() { // 函數聲明 函數名爲bar  
        console.log("2");  
    } 
   
}  
test(); 

 結論
一、聲明會提高 io

二、 只有函數纔會限定做用域
繪製做用域鏈規則
    1> 將所有的 script 標籤看作一個總體. 是一個 0 級別的鏈
    鏈中全部的全局範圍內的變量, 函數, 對象... 都是鏈中的成員
   因爲聲明會提高, 所以在繪製鏈以前將代碼能夠進行調整, 在開始的時候
    將聲明都寫在前面, 繪圖的時候按照順序繪製, 較爲簡單.
   
   2> 因爲只有函數才能夠限定做用域. 所以在函數上引出一條新鏈, 級別爲 n + 1
   在函數內部, 又是一個完整, 獨立的做用域結構
   所以在函數內部定義的任何成員也按照 1> 中的規則在該鏈上展開

 3> 若是有函數, 繼續繪製下去console

 變量搜索原則 在代碼的運行過程當中, 若是訪問某一個變量 那麼首先在當前鏈上找 ( 無序 ), 若是沒有, 在 n-1 級上找 ( 在函數內部容許訪問定義在函數外部的變量 ) 如此往復, 直到 0 級鏈, 若是尚未 拋出異常 若是找到, 則結束尋找, 直接得到該鏈上變量的數據

相關文章
相關標籤/搜索