摘要:回調(diào)函數(shù)定義回調(diào)是一個函數(shù),它作為參數(shù)傳遞給另一個函數(shù),并在其父函數(shù)完成后執(zhí)行。這意味著回調(diào)函數(shù)本質(zhì)上是一個閉包。正如我們所知,閉包能夠進入包含它的函數(shù)的作用域,因此回調(diào)函數(shù)能獲取包含它的函數(shù)中的變量,以及全局作用域中的變量。
回調(diào)函數(shù) 定義
A callback is a function that is passed as an argument to another function and is executed after its parent function has completed.函數(shù)也是對象
回調(diào)是一個函數(shù),它作為參數(shù)傳遞給另一個函數(shù),并在其父函數(shù)完成后執(zhí)行。
1、函數(shù)是一種對象
function test() {}; console.log(test instanceof Object); // true
很明顯函數(shù)是一種對象,但你不能說函數(shù)是對象的一種。因為他倆之間是沒有包含關(guān)系的。有點像雞蛋和雞的關(guān)系。
2、對象都是通過函數(shù)創(chuàng)建的
先來看一個例子
function test() { this.name="哈哈" }; var test2=new test(); console.log(test2 instanceof Object); //true
這個例子可以說明對象可以被函數(shù)創(chuàng)建。那為什么要說對象都是通過函數(shù)創(chuàng)建的,那對象字面量是不是也是通過函數(shù)來創(chuàng)建的,答案是肯定的,這是一種語法糖方式。舉個簡單的例子
var obj={ name:"哈哈", age:"18" } var obj=new Object() obj.name="哈哈"; obj.age="18";
上面的對象字面量其實是通過下面的構(gòu)造函數(shù)來創(chuàng)建的。而其中的Object是一種函數(shù):
console.log(typeof Object) //function
通過上面的簡單例子我們可以得出一個結(jié)論:對象是通過函數(shù)創(chuàng)建的,而函數(shù)又是一種對象。
js的函數(shù)可以作為參數(shù)進行傳遞再看下面兩段代碼:
function say (value) { console.log((value)); } function execute (someFunction, value) { someFunction(value); } execute(say, "hi js.");
與
function execute (someFunction, value) { someFunction(value); } execute(function(value){console.log((value));}, "hi js.");
上面第一段代碼是將say方法作為參數(shù)傳遞給execute方法
第二段代碼則是直接將匿名函數(shù)作為參數(shù)傳遞給execute方法
實際上:
function say (value) { alert(value); } // 注意看下面,直接寫say方法的方法名與下面的匿名函數(shù)可以認為是一個東西 // 這樣再看上面兩段代碼是不是對函數(shù)可以作為參數(shù)傳遞就更加清晰了 say; function (value) { alert(value); }
這里的say或者匿名函數(shù)就被稱為回調(diào)函數(shù)!
回調(diào)函數(shù)是閉包都能夠我們將一個毀掉函數(shù)作為變量傳遞給另一個函數(shù)時,這個毀掉函數(shù)在包含它的函數(shù)內(nèi)的某一點執(zhí)行,就好像這個回調(diào)函數(shù)是在包含它的函數(shù)中定義的一樣。這意味著回調(diào)函數(shù)本質(zhì)上是一個閉包。
正如我們所知,閉包能夠進入包含它的函數(shù)的作用域,因此回調(diào)函數(shù)能獲取包含它的函數(shù)中的變量,以及全局作用域中的變量。
如何避免回調(diào)地獄你可以有如下幾個方法:
? 模塊化:將回調(diào)函數(shù)分割為獨立的函數(shù) ? 使用Promises ? 使用yield ? 來計算生成器或Promise
解析:這個問題有很多種答案,取決你使用的場景,例如ES6, ES7,或者一些控制流庫。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/105761.html
摘要:回調(diào)定義剛開始學(xué)習(xí)時,對回調(diào)函數(shù)的理解僅僅停留在知道定義階段。什么是回調(diào)函數(shù)就是將一個函數(shù)作為參數(shù)傳遞給另一個函數(shù),作為參數(shù)的這個函數(shù)就是回調(diào)函數(shù)。參考文章詳解回調(diào)函數(shù)以為例解讀異步回調(diào)和異步編程的種方法阮一峰的網(wǎng)絡(luò)日志 回調(diào)定義 剛開始學(xué)習(xí)javascript時,對回調(diào)函數(shù)的理解僅僅停留在知道定義階段。什么是回調(diào)函數(shù)? 就是將一個函數(shù)作為參數(shù)傳遞給另一個函數(shù),作為參數(shù)的這個函數(shù)就是回...
摘要:同步與異步以上為同步代碼,函數(shù)必須等函數(shù)執(zhí)行完畢后才能執(zhí)行。異步回調(diào)產(chǎn)生的結(jié)果就是,函數(shù)的調(diào)用并不直接返回結(jié)果,而往往是交給回調(diào)函數(shù)進行異步處理。 同步與異步: function a(){} function b(){} a(); b(); 以上為同步代碼,函數(shù)b必須等函數(shù)a執(zhí)行完畢后才能執(zhí)行。 function a(){ ...
摘要:在中回調(diào)函數(shù)非常重要,它們幾乎無處不在。首先你得先明白一點函數(shù)也是對象想弄明白回調(diào)函數(shù),首先的清楚地明白函數(shù)的規(guī)則。理解了函數(shù)也是對象,先不急聊回調(diào)函數(shù),先看看下面代碼只寫變量名返回的將會是方法本身,以字符串的形式表現(xiàn)出來。 在javascript中回調(diào)函數(shù)非常重要,它們幾乎無處不在。像其他更加傳統(tǒng)的編程語言都有回調(diào)函數(shù)概念,但是非常奇怪的是,完完整整談?wù)摶卣{(diào)函數(shù)的在線教程比較少,倒是...
摘要:回調(diào)函數(shù)不是由該函數(shù)的實現(xiàn)方直接調(diào)用,而是在特定的事件或條件發(fā)生時由另外的一方調(diào)用的,用于對該事件或條件進行響應(yīng)。大體意思就是回調(diào)是通過函數(shù)定義的變量通過參數(shù)傳入另一個函數(shù),在另一個函數(shù)進行調(diào)用,我們就稱之為回調(diào)函數(shù)。 1.回調(diào)的故事 1.最近辭職換了新工作,新公司的工作模式是前后端分離的,但是目前前端框架還需要了解以及熟悉,之前的框架又想廢棄,于是不得不用原生來開發(fā),但是原生得造輪子...
閱讀 2820·2023-04-25 15:01
閱讀 3080·2021-11-23 10:07
閱讀 3367·2021-10-12 10:12
閱讀 3458·2021-08-30 09:45
閱讀 2196·2021-08-20 09:36
閱讀 3587·2019-08-30 12:59
閱讀 2436·2019-08-26 13:52
閱讀 934·2019-08-26 13:24