mysql閉包的作用域 預編譯 閉包 作用域鏈

2021-10-20 23:34:33 字數 1244 閱讀 3472

預編譯

先go後ao

ao執行順序先形參定義 變數提公升

形參實參統一

函式提公升並且定義賦值

閉包函式內部 return 乙個內部函式被外部變數接收

外部變數可以使用內部函式 ao 中的值

閉包的好處是可以防止全域性變數汙染,但是閉包多了也會有記憶體洩漏的風險function test1()var a = 3return test2

}var c = 3var test3 = test1()

test3() //3複製**

答案是 3go:

test2.[[scope]] = test2.ao->test1.ao->go複製**

tips:閉包裡儲存的變數有點像 class 裡面的類方法(只是形式像其實不一樣)function mymath1(num)function myreduce()return [myadd,myreduce]

}function mymath2(num),reduce:function myreduce()

}return options

}var a = mymath1(10)

a[0]() //11a[1]() //10var b = mymath2(10)

b.add() 複製**

作用域鏈function a()

b()a()複製**全域性生成 go:

a 函式被定義時系統生成

[[scope]]屬性,[[scope]]儲存該函式的作用域鏈,該作用域鏈裡的第 0 位儲存 go

a 函式在被執行時(前一刻)進行預編譯生成 a 函式的 ao(執行上下文),同時作用域鏈的第 0 位儲存 a 函式的 ao,同時第 1 位儲存 go。查詢變數是到 a 函式儲存的作用域鏈中從上往下依次查詢。

a 函式預編譯時定義 b 函式,生成 b 函式[[scope]]

b 函式被定義時是在 a 函式環境下,所以 b 函式此時的作用域鏈就是 a 函式被執行時的作用域鏈

b 函式被執行時(前一刻)進行預編譯生成 b 函式的 ao(執行上下文),b 函式 scope 第 0 位儲存 b 函式 ao,第 1 位儲存 a 函式的 ao,第 2 位儲存 go

b 函式執行完後 b 函式的 ao 被銷毀,回歸被定義時的狀態

a 函式執行完後 a 函式的 ao 被銷毀,b 函式的[[scope]]也不復存在,a 函式回歸被定義時的狀態

tips:上級執行(執行前一刻預編譯),下級定義

定義時生成作用域鏈 scope,執行時(執行前一刻)生成 ao

作用域 閉包

1.js執行順序 語法分析 預編譯 先生成go物件 1.函式執行生成ao物件 2.形參和變數作為ao物件的鍵名,鍵值是undefined 3.實參賦值給形參 4.在函式中找到函式宣告,把函式作為ao物件的屬性名,屬性值為函式體 執行js 作用域 變數作用範圍 1.作用域 變數作用範圍 1 函式作用域...

作用域,閉包,作用域鏈

一,作用域 變數在宣告它的函式及該函式所巢狀的任意函式是有定義的 例var num 2 function fun fun 二,作用域鏈 多個函式巢狀在一起,多個作用域相互巢狀,這是作用域鏈 var num 1 function fun function fun2 fun1 fun2 fun 訪問原則...

作用域 作用域鏈 閉包

閉包概念中的一些專業名詞概念不清晰 作用域鏈 本質是乙個指向變數物件的指標列表。函式的作用域鏈在函式呼叫完成後即被銷毀。變數物件 全域性變數物件 js執行時一直存在 活動變數物件 區域性變數物件,函式執行完畢後銷毀 函式在呼叫時建立本地的活動物件加上函式定義時預建立的作用域鏈,形成乙個新的用於執行函...