?什麼是做用域鏈,如何肯定變量的的做用域javascript
?咱們在寫代碼的過程當中,如何合理的定義變量的做用域html
?全局做用域 & 某文件內的做用域java
【1】javascript DOM 高級程序設計ide
做用域鏈是用來描述一種路徑的術語,沿着該路徑能夠肯定變量的值,或者當函數被調用時要使用的方法。函數
function myFunction(){ var myVariable = 'inside'; //local variable } console.log(myVariable); //'undefied' var myVariable = 'outside'; //global variable myFunction(); console.log(myVariable); //'outside' function myFunction2(){ myVariable = 'inside'; //global varabile console.log('funciton2: ' + myVariable); } var myVariable = 'outside'; //global varabile myFunction2(); console.log(myVariable); //'inside'
【2】http://www.cnblogs.com/lhb25/archive/2011/09/06/javascript-scope-chain.htmlspa
全局做用域設計
(1)最外層函數和在最外層函數外面定義的變量擁有全局做用域code
(2)全部末定義直接賦值的變量自動聲明爲擁有全局做用域(就是【1】中說的沒有使用var關鍵字定義的變量)htm
(3)全部window對象的屬性擁有全局做用域,window.name、window.location、window.top等對象
局部做用域: 函數內部使用var關鍵字定義的變量,和函數內部定義的函數
這篇文章【2】用圖片形象解釋了函數執行過程當中,標示符搜索的過程。
「在函數執行過程當中,每遇到一個變量,都會經歷一次標識符解析過程以決定從哪裏獲取和存儲數據。該過程從做用域鏈頭部,也就是從活動對象開始搜索,查找同名的標識符,若是找到了就使用這個標識符對應的變量,若是沒找到繼續搜索做用域鏈中的下一個對象,若是搜索完全部對象都未找到,則認爲該標識符未定義。函數執行過程當中,每一個標識符都要經歷這樣的搜索過程。」
考慮到標示符的搜索過程,咱們在寫代碼的時候,「儘可能少使用全局變量」,「一個好的經驗法則是:若是一個跨做用域的對象被引用了一次以上,則先把它存儲到局部變量裏再使用。」