一、函数回调
1.把函数的指针,当做函数的参数来调用。调用参数的时候,相当于调用函数。这就是函数的回调
math函数传入cc与dd参数
function math (num1,num2,fun) {
return fun(num1,num2)
}
math(1,2,cc)
math(2,3,dd)
function bb (num1,num2) {
return (num1+num2)*2-1
}
function cc (num1,num2) {
return (num1-num2)*2-1
}
math(3,4,cc)
function cc () {
}
2.通过匿名的调用
上面是调用函数的指针,直接用匿名函数代替。
math(2,3,function (num1,num2) {
return (num1+num2)*3-1
})
3.定义和执行同时进行
括号的两个作用1,优先级运算。2.运行函数
((function aa (num1,num2,fun) {
return fun(num1,num2)
})(2,3,function (num1,num2) {
return (num1+num2)*2
}))
所有的事件函数都可以传入event参数方便处理事件。(event object) 对象,内置的回调函数接口
$("p").click(function(event){
alert(event.type); //"click"
});
(evnet object)属性方法:
event.pageX //事件发生时,鼠标距离网页左上角的水平距离
event.pageY //事件发生时,鼠标距离网页左上角的垂直距离
event.type //事件的类型
event.which //按下了哪一个键
event.data //在事件对象上绑定数据,然后传入事件处理函数
event.target //事件针对的网页元素
event.preventDefault() //阻止事件的默认行为(比如点击链接,会自动打开新页面)
event.stopPropagation() //停止事件向上层元素冒泡
二、递归
递归就是方法自己调用自己
实现递归的三要素
1.方法中出现自己调用自己
2.要有分支
3.要有结束条件
非递归求阶乘
static long notDigui(int n){
long result=1;
for(int i=1;i<=n;i++){
result=result*i;
}
return result;
}
递归方法求阶乘
static long digui(int n){
if(n==1){
return 1;
}
return n*digui(n-1);
}
public static void main(String[] args) {
System.out.println(Demo03.notDigui(5)); // 1*2*3*4*5
System.out.println(Demo03.digui(5));
}
function bb (num) {
if(num==1){
return num;
}else{
return num*bb(--num)
}
}
bb(4)
4*3*2*1
对于for或者while循环,只是将重复的步骤利用循环来处理,循环处理完一个步骤后,又进行下一个类似的步骤,关键点是要找出循环的依据和各步骤的相同点(既要循环的部分),什么情况下要继续循环,什么情况下要终止循环。
while循环
public int sumByMax(int max){
int result=0;
while(max>=1){
result+=max;
max--;
}
return result;
}
递归
public int sumByMax(int max){
if(max>=2){
return max+sumByMax(max-1);
}else{
return max;
}
}
使用递归时,需先找出重复步骤之间的相同逻辑,然后将这些逻辑实现在一个方法中。
递归是在进行一个步骤,进行到某处时,通过调用自身进行分层,在下一层开始紧接着的下一个步骤,
如果下一层不是定义的最后一层,则会在相同的地方再次分层,直到进入最底层,如上例中,max如果
为5,在进行max为5的这一层操作时,将会运行addByMax(4),分层,下一层的max将为4,此时因为定义了max为1时
才为最底层,所以会继续分层,这时max为3,再分,为2,再分,为1,到达最底层,然后
从最底层开始将各层的结果一次向上传递,回归到最顶层,返回最终结果,形成上一层调用下一层,比如此例中的 max+addByMax(max-1) 。
最后注意定义一个最底层,即开始向上回归结果的那一层,最底层将不再调用自身进行递归