回調函數和閉包

 

回調函數就是一個通過函數指針調用的函數。如果你把函數的指針(地址)作爲參數傳遞給另一個函數,當這個指針被用爲調用它所指向的函數時,我們就說這是回調函數。回調函數不是由該函數的實現方直接調用,而是在特定的事件或條件發生時由另外的一方調用的,用於對該事件或條件進行響應。

    在JavaScript中:回調函數的具體定義爲:  函數A作爲參數(函數引用)傳遞到另一個函數B中,並且這個函數B執行函數A。我們就說函數A叫做回調函數。如果沒有名稱(函數表達式),就叫做匿名回調函數。

<!DOCTYPE HTML> 
<html> 
<head>  
<meta charset="utf-8" />
<title>回調函數(callback)</title> 
<script type="text/javascript" src="http://cdn.bootcss.com/jquery/1.9.0/jquery.min.js"></script>
<script language="javascript" type="text/javascript"> 
    var f;
    function d(){
        alert("我是Jquery定義的函數d");
    }
    var e = function(){
        alert("我也是Jquery定義的函數e");
    }
    
    function a(callback) {    
        alert("我是parent函數a!");   
        d(); 
        if (typeof callback === "function"){
            //alert(callback);
            callback(); 
        }
    } 
    function b(){ 
        alert("我是回調函數b");  
      
        d();
        e();
        f();
    } 
    function c(){ 
        alert("我是回調函數c");   
        d();
        e();
        f();
    } 
    function test1() { 
        a(b); 
    } 
    function test2() { 
        a(c); 
    } 
    $(function(){ 
        f = function(){ 
            alert("我是回調函數f");   
        } 
    });
</script> 
</head> 
<body > 
    <h1>學習js回調函數</h1> 
    <button onClick=test1()>test a(b)</button> 
    <button onClick=test2()>test a(c)</button> 
    <p>應該能看到調用了兩個回調函數</p> 
    <p > </p> 
</body> 
</html>

閉包例子

function lazy_sum(arr) {
    var sum = function () {
        return arr.reduce(function (x, y) {
            return x + y;
        });
    }
    return sum;
}
var f = lazy_sum([1, 2, 3, 4, 5]); // function sum()
f(); // 15


閉包(似乎是談JavaScript漏不掉的問題):

  什麼是閉包?還是那句話:  首先,他是一個函數,其次,他能訪問包含他的外部函數的變量,粗糙點理解,就是:定義在一個函數內部的函數,但是呢,這個裏面的函數他訪問了他外面的那個函數的變量。這對於外面函數來說,就形成了閉包.

function foo(x) {
    var tmp = 3;
    return function (y) {
        alert(x + y + (++tmp));
    }
}
var bar = foo(2); // bar 現在是一個閉包
bar(10);      //16

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章