作用域和閉包初識

2021-09-24 16:19:23 字數 3698 閱讀 7349

先建立ao物件

找形參和變數宣告,將變數和形參作為ao屬性名,值為undefined

實參形參統一

函式體中找函式宣告,值賦為函式體

eg

function

fn(a)

console.

log(b)

;// undefined

var a =

123;

console.

log(a)

;//123

functiona(

) console.

log(a)

;//123

varb

=function()

console.

log(b)

;//function () {}

functiond(

)}fn(

1);//預編譯過程

// 1. 建立ao物件

// 2. ao

// 3. ao

// 4.ao

// b : undefined

// d : function d () {}

//之後開始執行函式

做一道題,先找go(全域性的) , 再找ao(自己的)

執行期上下文:當函式執行時,會建立乙個稱為執行期上下文的內部物件,函式執行就會產生執行期上下文(獨一無二的),執行完一次會銷毀一次。

[[scope]]:儲存作用域執行期上下文的集合。

[[scope]]中所儲存法人執行期上下文物件的集合,這個集合呈鏈式連線,我們把這種鏈式連線叫做作用域鏈。作用域鏈先將自己的ao放在第0位,然後才是go。

查詢變數:在哪個函式裡面查詢變數,就在這個函式的作用域鏈的頂端依次向下查詢。

舉個栗子

functiona(

)var a =

123;b(

);}var glob =

100;a(

);

剛開始的時候a被定義

此時a要被執行

b在開始時就在a的ao中

b在執行時會產生乙個屬於自己的ao,放在作用域鏈最頂端 0位。

當內部函式被儲存到外部時,將會生成閉包

閉包會導致原有作用域鏈不釋放,造成記憶體洩漏。

閉包的作用

functiona(

)var aaa =

124;

return b;

//形成閉包,執行之後銷毀a的 ao,但是b的沒有被銷毀

}var glob =

100;

var demo =a(

);//此時存的是b

demo()

;//124

首先當a定義

a執行完之後,把b存到外部了,a的ao被銷毀,但是b還存著a的ao

此時執行demo也就是執行b,找第0位,自己的ao中沒有aaa,找第一位,也就是之前a的ao,其中的aaa = 124,訪問這個aaa。

1.累加器

function

test()

functionb(

)return

[a,b]

;//a,b都和test產生閉包,一對二的關係

}var myarr =

test()

; myarr[0]

();//101

myarr[1]

();//100,在前乙個ao的基礎上減,因為共用乙個test產生的ao

具體講解如下

2.快取

function

eater()

, push :

function

(myfood)

}return obj;

}var eater1 =

eater()

; eater1.

push

('banana');

eater1.

eat();

//i am eating banana

執行完就被釋放,其餘和函式一樣基本結構

1.

(function()

())//建議使用第一種2.(

function())()

eg

(

function

abc()(

))//執行一次之後訪問abc會報錯,被銷毀了

只有表示式才能被執行

function

test()

()//這種不能被執行,這個叫函式宣告

能被執行符合執行的表示式的函式名會被自動忽略

var

test

=function()

();//可以執行,再次訪問test,返回undefined

立即執行函式舉例

var num =

(function

(a,b)(1

,2))

;

下次將深層次講解閉包和物件

作用域和閉包

給執行上下文環境下乙個通俗的定義 在執行 之前,把將要用到的所有的變數都事先拿出來,有的直接賦值了,有的先用undefined占個空。全域性 的上下文環境資料內容為 1 普通變數 包括函式表示式,如 var a 10 宣告 預設賦值為undefined 2 函式宣告 如 function fn 賦值...

作用域和閉包

題目 知識點 1 執行上下文 2 this 3 作用域 4 作用域鏈 5 閉包 一 執行上下文 ps 函式宣告和函式表示式的區別 執行上下文 console.log a undefined var a 10 fn 張三 22 張三 22 function fn name 在script標籤內的全域性...

作用域和閉包

現有宣告後有賦值 宣告在編譯時會提公升位置,提公升時函式會優先變數,如果是同名函式順序排在後面的會覆蓋前面的函式 函式表示式 立即執行的函式表示式 var a 2 function iife global window 塊作用域和閉包 閉包 function foo return bar var b...