1. 程式人生 > >JS回撥函式詳解

JS回撥函式詳解

JS回撥函式

何為回撥函式,官方解釋:當程式跑起來時,一般情況下,應用程式(application program)會時常通過API呼叫庫裡所預先備好的函式。但是有些庫函式(library function)卻要求應用先傳給它一個函式,好在合適的時候呼叫,以完成目標任務。這個被傳入的、後又被呼叫的函式就稱為回撥函式(callback function)。

通常將一個函式B傳入另一個函式A,並且在需要的時候再呼叫函式A。

說白了,回撥就是回溯,先定義好將要使用的函式體,然後在使用使再呼叫這個函式,我們通常把callback作為一個引數傳入先定義的那個函式。下面我們先來看一段jquery程式碼:

$("p").hide(1000,function(){
alert("The paragraph is now hidden");
});

上面jquery就是一個回撥函式,首先它在執行完hide效果後,接著呼叫function回撥函式。

我們再來看一段JS程式碼,看看回調函式是如何實現的:

function Buy(name,goods1,callback) {
    alert(name+' buy '+goods1);
    if(callback&&typeof(callback)==="function")
        callback();
}
Buy('xiaoming','apple',function(){
    alert("shopping finish");
});

一個很簡單的程式碼,一開始不知道要買啥,等到買到東西,立即把之前定義好的函式調用出來,最好加上判斷規則,因為一切前提是callback必須是一個函式,輸出結果為:

xiaoming buy apple
shopping finish

閉包與回撥

下面看一道閉包的題目,分別點選第一個和第四個節點,執行結果:

var nodes = document.getElementsByTagName('button');
for (var i = 0; i < nodes.length; i++) {
    nodes[i].addEventListener('click', function() {
        console.log('You clicked element #' + i);
   });
}

這裡雖然主要考的是閉包,addEventListener是一個閉包,而匿名函式是一個回撥函式,i是在閉包中的變數。在addEventListener的回撥執行時,迴圈已經結束,此時的變數i被賦值為node.length,node.length為總節點數。所以結果就是

You clicked element # node.length

那要怎麼改,將其返回值改成函式,既然i變數的值會被釋放,那我們就引入i,讓每次迴圈的值都儲存在記憶體中,就可以了:

var nodes = document.getElementsByTagName('button');
for (var i = 0; i < nodes.length; i++) {
(function(i) {
    nodes[i].addEventListener('click', function () {
        console.log('You clicked element #' + i);
        })
    })(i);
}

PHP回撥函式

下面略說一下php中回撥函式如何實現(結果為1,2,3,4):

<?php
    $array=array(1,2,3,4);
    array_walk($array,function($value){
        echo $value;});
?>

php對每個傳入的陣列元素作回撥處理,下面再看看php的閉包,使用use關鍵字繼承作用域外的變數:

<?php
    function getcouter(){
        $i=0
        return function() use($i)(
            echo $i;
        )};
    }
    $counter=getcounter();
    echo $counter();
    echo $counter();
?>

返回結果為:

1,1

官方php使用方法

class hello {
function callback($a,$b) {
echo "$a,$b";
}
static function callback($c,$d){
echo "$c,$d";      
}
}
//將類名作為引數
call_user_func(array('hello','callback'),"hello","world");
//輸出 hello,world
//將物件作為引數
call_user_func(array(new hello(),'callback'),"hello","world");
//將靜態方法作為引數
call_user_func(hello::callback,"hello","world");
//輸出 hello,world

其實就原理來說,JS和php都是差不多的,都是先定義好函式,然後需要的時候就呼叫過來。

相關推薦

JS函式

JS回撥函式 何為回撥函式,官方解釋:當程式跑起來時,一般情況下,應用程式(application program)會時常通過API呼叫庫裡所預先備好的函式。但是有些庫函式(library function)卻要求應用先傳給它一個函式,好在合適的時候呼叫,以完

java函式

宣告:部落格參考於https://www.cnblogs.com/yangmin86/p/7090882.html,謝謝哥們 回撥函式:是指在A類執行程式碼時,呼叫了B類中的方法,但B類中的方法執行了A類中的方法。 example: 1、Boss.java(Boss類中執行程式碼,呼叫了Emp類的doP

java 函式

在C或者C++中回撥函式的定義: 程式在呼叫一個函式時,將自己的函式的地址作為引數傳遞給程式呼叫的函式時(那麼這個自己的函式稱回撥函式) Java中沒有指標,不能傳遞方法的地址,一般採用介面回撥實現:把實現某一介面的類建立的物件的引用賦給該介面宣告的介面變

cocos2d-x 函式

[cpp] view plaincopyprint? typedefvoid (CCObject::*SEL_CallFuncN)(CCNode*);// 帶執行者回調typedefvoid (CCObject::*SEL_CallFuncND)(CCNode*, void*); // 帶一個自定引

jquery的ajax方法的函式

前言 最近學習jquery的$.post(),$.get(),$("#div1").load(),$.ajax()方法,發現確實很方便,但是對函式返回值確不理解,後面自己做了幾個實驗,總結後把結論整理

js函式傳參

回撥函式是沒有引數的,那怎麼傳遞引數呢? 1 function getEntity(url,callBackFun){ 2 if(callBackFun!=undefined && typeof callBackFun=='function'){ 3 cal

一個js函式的使用例項callback

checkModuleUpdate: function (supplier_id, module_type, ver, category_id, callback) { var me = this;

js--函式

今天碰到一個問題,如何獲取一個函式非同步操作的結果?(setTimeout,readFile,writeFile,ajax) 答:用回撥函式。 看下面這個例子: function add(x,y,callback) { console.log(1) setTimeout(

java機制

原文出自這兒:https://blog.csdn.net/fengye454545/article/details/80198446   為了自己能夠加深理解自己動手敲了一遍,也寫寫,有時間看看。更詳細建議訪問原創博主。 ===========================

JS函式--簡單易懂有例項

  初學js的時候,被回撥函式搞得很暈,現在回過頭來總結一下什麼是回撥函式。   我們先來看看回調的英文定義:A callback is a function that is passed as an argument to another function and i

介面機制

在一個類中進行介面定義和呼叫介面中的方法public class Topbar { //需要一個變數來對映呼叫者傳進來的一個介面 private topbarClickListner liste

Node.js 函式來解決SQL語句與返回值的非同步問題

    作為一個剛剛接觸Node的菜鳥,面對Node的非同步問題著實是頭大。最近做一個前端的分頁問題,原始碼是順序執行兩條sql語句然後返回: client.query( //第一個sql 'SELECT * FROM products' ,

Activity 生命週期方法

前文《 Activity(Intent-filter詳解及跳轉) 》我們瞭解了Activity的跳轉,從一個Activity跳轉到另一個Activity。剛開始接觸Activity的時候,我們的setContenview都是寫在onCreate方法中的。這個on

Android 介面機制

       在使用介面回撥的時候發現了一個經常犯的錯誤,就是回撥函式裡面的實現有可能是用多執行緒或者是非同步任務去做的,這就會導致我們期望函式回撥完畢去返回一個主函式的結果,實際發現是行不通的,因為

js 函式理解總結

<script type="application/javascript" language="JavaScript">function dosomething(damsg, callback) {                 callback();alert(damsg);if(typeo

JS函式全解析教程

自學jquery的時候,看到一英文詞(Callback),頓時背部隱隱冒冷汗。迅速google之,發現原來中文翻譯成回撥。也就是回撥函數了。不懂啊,於是在google回撥函式,發現網上的中文解釋實在是太“深奧”了,我承認自己才疏學淺了。看了幾個回撥的例子後,貌似有點理解了。

js 函式 3種用法

js 回撥函式大致有以下三種用法, 1,直接回調 2,call回撥 3,apply回撥 回撥函式作用得當,減少程式碼冗餘,程式碼可讀性增強,程式碼維護也輕鬆很多。 什麼要用到回撥函式呢? 當有很多地方需要呼叫同一個函式,並且這一函式根據不同的需要,作不同的處理,這個時候用

java的介面機制

原文地址:http://www.open-open.com/lib/view/open1461482321288.html 序言 最近學習java,接觸到了回撥機制(CallBack)。初識時感覺比較混亂,而且在網上搜索到的相關的講解,要麼一言帶過,要麼說的比較

Android EditText的TextWatcher監聽引數

先貼程式碼 mEditText = (EditText) findViewById(R.id.edittext); mEditText.addTextChangedListener(new TextWatcher() {

Java基礎篇:機制

一、什麼是回撥: 回撥是一種雙向的呼叫模式,程式模組之間通過這樣的介面呼叫完成通訊聯絡,回撥的核心就是回撥方將本身即this傳遞給呼叫方,這樣呼叫方就可以在呼叫完畢之後再告訴回撥方它想要知道的資訊。 回撥函式用於層間協作,上層將本層函式安裝在下層,這個函式就是回撥,而下層