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