在開發語言中常見的做用域規則有 塊級做用域和詞法做用域函數
做用域 顧名思義就是起做用的區域 定義一變量後 ,能夠在此範圍做用的區域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 級鏈, 若是尚未 拋出異常 若是找到, 則結束尋找, 直接得到該鏈上變量的數據