作用域:
1全域性作用域
全域性作用域就是最外層函式定義的變數,對任何內部函式來說,都是可以訪問的。
2.區域性作用域
區域性作用域就是只在固定**片段內可以訪問到,在函式外部是無法訪問的。
函式外是不可以訪問到函式內的,所以報錯。
作用域鏈:
[[scope]]中所儲存的執行期上下文物件的集合,這個集合成鏈式鏈結,我們把這種鏈式鏈結叫做作用域鏈
舉例:
1.預編譯,首先建立gogoc:undefined
逐行執行
goc:100
當函式體function a()執行時預編譯生乙個a的ao
ao逐行執行
ao當函式體function b()執行時預編譯會產生乙個b的ao
ao的作用域鏈是
第0位:a的ao
第1位:go
function a( ) 的作用域鏈是
第0位:b的ao
第1位:a的ao
第2位:go
所以在執行**時會先從自身的ao中查詢,如果找不到再向父級查詢,一級一級向上查詢。
當函式執行完時會將與自身相連的ao砍掉,也就是作用域鏈中的第0位
3.即執行函式
針對初始化功能的函式
形式:(function( ) ( ) ); w3c 建議第一種
(function( ) ) ( );
只有表示式才能被執行
只執行一遍就自動銷毀
4閉包
當內部函式被儲存到外部時,將會生成閉包。閉包會導致原有作用域鏈不釋放,造成記憶體洩漏
例子:
function test()預編譯首先建立go:return
arr;
}var myarr =test();
myarr();
go;當函式test()執行時預編譯會產生乙個ao
ao當執行到function arr() 時此時該函式體尚未執行,也就沒有產生自己的ao,他的函式鏈就只能站在test()的作用域鏈上
這個時候的arr的作用域鏈是
第0位:ao test()的
第1位:go
注意:當函式體arr被返回出去的時候執行完畢,此時test會將與自身相連的ao砍掉,也就是作用域鏈中的第0位,但此時函式體arr是已經被返回出去了的,所以他的作用域鏈是不受影響的
arr執行時會產生乙個ao,此時arr作用域鏈是
第0位:ao arr的
第1位:ao test()的
第2位:go
從自身的ao向父級查詢,直到找到需要的值為止;
js作用域與立即執行函式
var a 10 function one function two two 10 a 10是全域性的,而 a 20 是區域性的一 var a 10 function one one undefined 一是預解析,而是就近查詢。二 var a 10 function one one 10 這個雖然...
JS作用域和作用域鏈
什麼是js作用域?js作用域也就是js識別變數的範圍 1 全域性作用域 2 區域性作用域 3 e6的塊級作用域 全域性作用域 也就是定義在window下的變數範圍,在任何地方都可以訪問 區域性作用域 是只在函式內部定義的變數範圍 塊級作用域 簡單來說就是用let和const在任意的 塊中定義的變數都...
詞法作用域 VS 動態作用域 VS 立即執行函式
js詞法作用域是由你在寫 時將變數和塊作用域寫在 來決定。js動態作用域和this機制息息相關。它的作用域詩是在執行的過程中確定 var a 1 function foo foo 1從上面的 我們可以看出 foo中列印a的值不是由寫 的位置確定的,而是取決於foo執行的位置。最小授權原則最小授權原則...