1. JavaScript函數的作用域鏈分為定義時作用域鏈和運行時作用域鏈;
2.函數被定義的時候,它有一個屬性[[scope]]標明它的定義作用域鏈,定義時作用域鏈[[scope]]遵守這樣的規則:一個函數的定義時作用域鏈[[scope]]總是它所在的外部函數的執行時作用域鏈;
3.全局函數的定義作用域鏈只包含window的屬性;
4.一個函數的執行時作用域鏈總是在定義時作用域鏈的頭部壓入當前活動對象(它包含this,arguments,參數,局部變量);
5.函數執行時,變量尋址總是從作用域鏈的頂端朝下尋找;所以全局變量的尋址速度最慢;
6.內部函數被執行的時候,他仍然能夠訪問它完整的作用域鏈。這就是閉包能夠在運行時能夠訪問已經結束的外部函數定義的變量的原因;
7.函數執行遇到with語句時,會臨時在作用域鏈頂部壓入with指定的對象的所有屬性作為作用域鏈最頂端;
8.函數執行遇到catch的時候,會臨時在作用域鏈頂部壓入catch指定的錯誤對象作為作用域鏈的最頂端;
下面給一個例子并繪制出作用域鏈,以加深理解:
有這么一段代碼:
新聞熱點
疑難解答