本來callback function寫完,很自然地連結到解決callback hell的promise,但只理解皮毛的我實在是沒有太多的心得,還是先緩緩,先回來看閉包,其實現在想想閉包應該寫於callback甚至非同步之前的,那時三個東西卡在一起沒繞出來,又覺得不生出文章,我會沒安全感,於是跳來跳去之後,跳到覺得自己不能再跳了之後,硬是把非同步跟callback先生出來。
閉包就是一個函式連同他的語彙環境
//最簡單的閉包範例
function x(){
var a = 7
function y(){
console.log(a)
}
y()
}
x()
//7
function x(){
var a = 7
function y(){
console.log(a)
}
return y
}
var z = x()
console.log(z)
z()
如果把上述程式碼丟去devtool會回傳如下訊息
從console.log(z)回傳函式y且呼叫z回傳7,可以看出z不只記憶了函式y,還連同它的語彙環境,所以呼叫z才有辦法回傳7,換句話說,z記憶的就是因為y而產生的整個閉包。
function outer() {
var a = 10
setTimeout(function () {
console.log(a);
}, 3000)
console.log(`hello`)
}
outer()
//hello
//10
這個setTimeout同樣也是個閉包,所以在計時結束後,callback放入queue再等callstack空了之後進到callstack,根據語彙環境找到a=10接著印出10。
function print() {
for (var i = 1; i <= 5; i++) {
setTimeout(function () {
console.log(i);
}, i * 1000)
}
}
print()
//6
//6
//6
//6
//6
function print() {
for (let i = 1; i <= 5; i++) {
setTimeout(function () {
console.log(i);
}, i * 1000)
}
}
print()
//1
//2
//3
//4
//5
function print() {
for (var i = 1; i <= 5; i++) {
function closure(i){
setTimeout(function () {
console.log(i);
}, i * 1000)
}
closure(i)
}
}
print()
//1
//2
//3
//4
//5
//跟上面是一樣的,只是改這樣讓我看得比較清楚
function print() {
for (var i = 1; i <= 5; i++) {
closure(i)
}
}
function closure(i) {
setTimeout(function () {
console.log(i);
}, i * 1000)
}
print()
//1
//2
//3
//4
//5
結果我這兩天最大的收穫跟主題沒關係...而是我終於搞懂了函式本身跟函式呼叫,哈哈哈哈哈哈,一個好像很基本的東西,從昨天huli老師提醒初學者callback容易犯的錯,那時寫筆記,覺得懂,但今天在影片看完,自己實作第一個踩的坑,就是我把y()寫成y。雖然明明老師提醒過,我還是跌進坑裡,不過沒關係,真的跌進去爬出來後,我才真的深深體會到兩個的不同,也是很開心。
閉包透過閱讀這幾隻影片後,有比較深入的了解,雖然試著敘述給自己的的時候,還是卡卡的,我想還需要時間,另外令我振奮的是他的熱情及他對JavaScript的熱愛,感染了我,讓我感到學習是件很享受的事。
努力看完天書後,來點輕鬆的吧!分享我兒子的童言童語,調劑身心一下
阿咖有一天下課跟我分享了康丁斯基的畫
我心想好有藝術氣息喔他
難得上課這麼認真
結果⋯
咖:他是康丁斯基,我是許XX司機⋯