本文详解JavaScript与PHP中回调函数的定义、原理及具体用法。通过jQuery hide 方法、DOM事件监听及 array_walk 等实例,展示如何将函数作为参数传递并在特定时刻执行。同时深入解析闭包在回调中的应用,解决变量捕获问题,并提供PHP中类方法回调的实现方式。
本文通过具体实例阐述JavaScript中回调函数的工作原理与实际应用方法,供读者参考学习。
JS回调函数原理
JS回调函数
所谓回调函数,在程序运行期间,应用程序通常通过API调用库中预置的函数。然而,部分库函数要求应用先传入一个函数,以便在适当时机调用该函数以完成特定任务。这个被传入、随后又被调用的函数即被称为回调函数(callback function)。
一般做法是将一个函数B作为参数传入另一个函数A中,并在需要时由函数A调用函数B。
简而言之,回调即先定义好函数体,在使用时再调用该函数,通常将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,即节点总数。因此输出结果为:
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回调函数
简要说明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 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基本一致,均是先定义好函数,随后在需要时调用该函数。
更多关于JavaScript相关内容可查看本站专题:《JavaScript常用函数技巧汇总》、《javascript面向对象入门教程》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》及《JavaScript数学运算用法总结》
希望本文所述对大家JavaScript程序设计有所帮助。