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