閉包練習題

2021-09-28 19:51:16 字數 1791 閱讀 6536

var data =

;for

(var i =

0; i <

3; i ++)}

(i))

}data[0]

();data[1]

();data[2]

();

答案:0 1 2
function

fun(n, o)};

}var a =

fun(0)

;//這裡第一次呼叫fun時輸出undefined,返回了乙個物件給a, n=0

a.fun(1)

;//這裡首先呼叫了a物件的屬相fun,屬性fun,又呼叫了乙個閉包函式,m = 1,返回乙個fun(1,0)

//執行fun(1,0),輸出0,且又返回了乙個物件

a.fun(2

);//返回的就是fun(2,0) //0

a.fun(3

);//返回的就是fun(3,0) //0

var b =

fun(0)

.fun(1

).fun(2)

.fun(3

)//fun(0)返回的是fun(0,0),fun(1)返回的是fun(1 , 0),輸出0,這時n=1,fun(2)返回的是fun(2,1),輸出1,這時n=2,fun(3)返回的是fun(3,2),輸出2,這是n=3;

var c =

fun(0)

.fun(1

);//undefined 0

c.fun(2

);//1 c.

fun(3)

;//1

function

fn1(),

10,i);}

}fn1()

;

延遲10ms後執行的function(i),i的值是儲存在第乙個計時器執行的值。

而tc得值早就更新為建立第4個計時器返回得值。

第一次執行function(i)得時候,就清除了最後乙個計時器,最後乙個計時器根本沒有執行

這道題主要考察了非同步和閉包的問題

非同步:js是單執行緒的,一次只能執行乙個命令。js在執行時會生成乙個主任務佇列(先進先出),佇列裡按照順序執行,當執行到settimeout時,settimeout會將裡面的函式放到非同步佇列中,當 settimeout執行完以後,js通過eventloop事件迴圈,發現非同步佇列中有任務等待,於是將其新增到隊i列中開始執行.

所以tc最後保留的是建立最後乙個計時器返回的值(tc = 4)之後才開始執行settimeout裡面的函式function(i)

閉包:即使settimeout執行結束,但已經對內產生了閉包,當再執行function時使用的值的環境,仍然對應當時建立計時器執行時的作用域鏈,而tc沒有被保留在閉包中,所以第一次cleartimeout(tc)時,就把最後乙個計時器清除了,導致根本沒有執行最後一settimeout,所以輸出得結果為 0 1 2

function

fn2(),

10,i,tc);}

}

每間隔10ms,執行一次function(i,tc),tc得值也被保留在閉包中(建立乙個計時器得環境中)

清除計時器在這裡第乙個值為undefined,i為1時才清除第乙個計時器

使得保留最後乙個計時器,每隔10ms就輸出3。

JS閉包 練習題

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

閉包作用域練習題2

寫出下列 的輸出結果 let a 0,b 0 function a a alert a a 1 a 2 此題的 函式執行會形成上下文,如果當前這個上下文中的內容 一般是堆記憶體 被之外的變數占有,那麼當前這個執行上下文不被釋放。全域性的執行上下文ec g 中有乙個儲存全域性變數的物件vo g 建立值...

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兩者關聯 開闢乙個堆記...