javascript - 回調(diào)函數(shù)和普通調(diào)用函數(shù)的區(qū)別?
問(wèn)題描述
回調(diào)函數(shù)的定義是將b函數(shù)當(dāng)做參數(shù)傳給a去執(zhí)行,此時(shí)b就是回調(diào)函數(shù),我突然有個(gè)疑問(wèn),它和a函數(shù)里直接調(diào)用b有什么區(qū)別呢?我自己寫(xiě)了個(gè)demo
function a(){ b(); console.log(’hello world’);}function b(){ var n = 0; for(var i = 0;i < 1000000000;i++){n++; } return n;}a(); //hello world
大概3秒鐘才能看到輸出結(jié)果,然后改寫(xiě)為回調(diào)函數(shù)的形式
function a(callback){ callback.call(this); console.log(’hello world’);}function b(){ var n = 0; for(var i = 0;i < 1000000000;i++){ } console.log(1);}a(b); //hello world
也是3秒后才能看到輸出結(jié)果找了很多文章,都說(shuō)明了當(dāng)b作為a函數(shù)的回調(diào)函數(shù)執(zhí)行時(shí),并不妨礙a函數(shù)的正常執(zhí)行,按照這個(gè)邏輯,第二種方式應(yīng)該是立即輸出hello world的,難道是我回調(diào)函數(shù)用錯(cuò)了嗎?還是理解有問(wèn)題?
問(wèn)題解答
回答1:1.性能沒(méi)有區(qū)別2.回調(diào)函數(shù)是作為參數(shù)傳遞的,操作更加靈活,比如,你可以定義一個(gè)函數(shù)c,那可以運(yùn)行 b(c),當(dāng)你在函數(shù)內(nèi)運(yùn)行函數(shù)的時(shí)候,就失去了變量的靈活性。
回答2:嗯,是你理解錯(cuò)了,調(diào)用的效果是一樣的。還有 callback.call(this); 畫(huà)蛇添足,跟 callback() 的 this 是一樣的。
回調(diào)的好處是依賴倒置,不用修改 a 的代碼就可以讓 a 調(diào)用 c、d、e....
相關(guān)文章:
1. javascript - 使用form進(jìn)行頁(yè)面跳轉(zhuǎn),但是很慢,如何加一個(gè)Loading?2. python 計(jì)算兩個(gè)時(shí)間相差的分鐘數(shù),超過(guò)一天時(shí)計(jì)算不對(duì)3. angular.js - angularjs 注入模塊報(bào)錯(cuò) 很怪異... 求解惑4. javascript - ES6規(guī)范下 repeat 函數(shù)報(bào)錯(cuò) Invalid count value5. docker-machine添加一個(gè)已有的docker主機(jī)問(wèn)題6. javascript - 后臺(tái)管理系統(tǒng)左側(cè)折疊導(dǎo)航欄數(shù)據(jù)較多,怎么樣直接通過(guò)搜索去定位到具體某一個(gè)菜單項(xiàng)位置,并展開(kāi)當(dāng)前菜單7. docker-compose中volumes的問(wèn)題8. javascript - JS 里面的 delete object.key 到底刪除了什么?9. javascript - html5的data屬性怎么指定一個(gè)function函數(shù)呢?10. angular.js - 輸入郵箱地址之后, 如何使其自動(dòng)在末尾添加分號(hào)?
