js 作用域,作用域鏈,立即執行函式,閉包

2022-05-03 04:45:10 字數 1639 閱讀 5126

作用域:

1全域性作用域

全域性作用域就是最外層函式定義的變數,對任何內部函式來說,都是可以訪問的。

2.區域性作用域

區域性作用域就是只在固定**片段內可以訪問到,在函式外部是無法訪問的。

函式外是不可以訪問到函式內的,所以報錯。

作用域鏈:

[[scope]]中所儲存的執行期上下文物件的集合,這個集合成鏈式鏈結,我們把這種鏈式鏈結叫做作用域鏈

舉例:

1.預編譯,首先建立go

goc: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()

return

arr;

}var myarr =test();

myarr();

預編譯首先建立go:

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執行的位置。最小授權原則最小授權原則...