首先說明一下,JavaScript沒有用動態做用域概念,但 this 機制卻和動態做用域相似!
JavaScript是經過做用域鏈的方式進行變量查找的,而JS做用域鏈是詞法做用域,也就作靜態做用域!
詞法做用域:在函數聲明(定義)時肯定的
動態做用域:在函數調用時肯定的javascript
var cat = '有魚'; function person() { console.log(cat); // 有魚 } function student() { var cat = '年年'; person(); } student();
代碼分析:
①調用student函數,其內部又調用了person函數,由於JS使用的是詞法做用域,即關心的是函數聲明時的做用域,因此咱們須要看查person定義裏面的狀況;
②person函數內部輸出了cat,此時,找不到cat,按照做用域鏈特性向外層尋找,找到了cat爲‘有魚’;因此結果輸出的是‘有魚’;
③若是JS支持動態做用域,則須要看person()調用所在的做用域,即cat='年年';不過JS不支持動態做用域!java