代碼以下:html
var x = 1; function A(y){ var x = 2; function B(z){ console.log(x+y+z); } return B; } var C = A(1); C(1);
分析以下:函數
階段一:全局初始化階段this
js引擎在進入一段可執行代碼時,要完成如下三個初始化工做:spa
階段二:執行函數Acode
當執行函數A(1)時,js引擎要完成如下三個工做:htm
階段三:執行函數B 對象
函數A被執行之後,返回了B的引用,並賦值給了變量C,執行 C(1) 就至關於執行B(1),JS引擎須要完成如下工做:blog
當函數B執行「x+y+z」時,須要對x、y、z 三個標識符進行一一解析,解析過程遵照變量查找規則:先查找本身的變量對象(活動對象)中是否存在該屬性,若是存在,則中止查找並返回;若是不存在,繼續沿着其做用域鏈從頂端依次查找,直到找到爲止,若是整個做用域鏈上都未找到該變量,則返回「undefined」。作用域
函數B的做用域鏈爲:get
B的變量對象----->A的變量對象----->全局變量對象
所以,變量x會在A的變量對象中找到,y也會在A的變量對象中找到,z在本身的變量對象中找到 ,結果爲2+ 1+ 1 = 4;
總結:
參考博客地址:http://www.cnblogs.com/onepixel/p/5090799.html(強烈推薦)