閉包作用域練習題2

2021-10-10 05:57:04 字數 892 閱讀 1468

寫出下列**的輸出結果:

let a=0,

b=0;

function a(a);

alert(a++);

}a(1);

a(2);

此題的**:

函式執行會形成上下文,如果當前這個上下文中的內容(一般是堆記憶體)被之外的變數占有,那麼當前這個執行上下文不被釋放。

全域性的執行上下文ec(g)中有乙個儲存全域性變數的物件vo(g):建立值0,建立變數名a,兩者關聯;建立值0,建立變數名b,兩者關聯;建立函式堆記憶體0x001[此函式堆的作用域:ec(g)/形參:a],建立函式名a,兩者關聯。

【a(1);】函式a第一次執行,形成乙個私有的執行上下文ec(a1),**執行過程中建立乙個內部堆函式0x002,將此函式堆複製給變數a,變數a不是當前這個執行上下文中ao(a1)中的私有變數,順著作用域鏈向上找,a是全域性作用域中的全域性變數vo(g)的。

變數名a與函式堆0x002關聯,函式堆0x001不再與函式名a關聯,所以會出棧釋放

因為全域性變數a與私有的執行上下文ec(a1)中的函式堆0x002關聯,這個執行上下文乙個堆記憶體被外界占用,所以當前這個私有的執行上下文ec(a1)不被釋放出棧,將自己上下文中的私有變數【比如函式堆0x002和形參a】保護和儲存起來,形成閉包。

【a(2)】第一次執行函式a,在執行過程中把函式a重構了,第二次執行的時候是重構後的函式即函式堆0x002這個函式執行。此函式執行過程中遇到變數a、b,變數a不是自已私有的,ao(a2)中只有b,順著作用域鏈向上查詢,找到ec(a1)這個執行上下文的ao(a1)中有。執行完成後當前這個執行上下文ec(a2)會出棧釋放掉。

閉包練習題

var data for var i 0 i 3 i i data 0 data 1 data 2 答案 0 1 2function fun n,o var a fun 0 這裡第一次呼叫fun時輸出undefined,返回了乙個物件給a,n 0 a.fun 1 這裡首先呼叫了a物件的屬相fun,屬...

JS閉包 練習題

牛客網關於閉包的一道題的解析 實現函式 makeclosures,呼叫之後滿足如下條件 1 返回乙個函式陣列 result,長度與 arr 相同 2 執行 result 中第 i 個函式,即 resulti,結果與 fn arr i 相同 示例1 輸入 1,2,3 function x 輸出 4 v...

THIS和閉包的綜合練習題

寫出下面 的輸出結果 var x 3,obj obj.fn function var fn obj.fn obj.fn 6 fn 4 console.log obj.x,x 此題的 全域性 執行形成乙個全域性上下文ec g 有乙個全域性變數物件vo g 建立乙個值3,建立變數x兩者關聯 開闢乙個堆記...