码迷,mamicode.com
首页 > 其他好文 > 详细

函数通信和递归详解

时间:2016-01-13 21:31:02      阅读:219      评论:0      收藏:0      [点我收藏+]

标签:

一 函数通信

函数通信就是不同函数之间如何实现变量的共享交换。实现方法大概有三种:参数传递,返回值,全局变量。下面举例来说明这3中方法。

1 参数传递就是把函数名当做另外一个函数的参数来传递,这样2个函数就可以相互通信,为了方便使用了JavaScript语法。

function fn1(str){
    console.log(str);
};
function fn2(fn1){
    fn1("Hello World");
};
fn2(fn1);

 

上面代码fn2可以利用参数fn1,在自己的函数中调用fn1,实现想要的功能。

2 返回值方法 

function fn1(str){
    return str;
}
function fn2(){
    var s = fn1("Hello World");
    console.log(s);
}
fn2();

 

 3 全局变量方法

var s = "Hello World";
function fn1(){
    console.log(s);
}
function fn2(){
    s = s+"i am fine;";
    console.log(s);
}
fn2();// Hello Worldi am fine;
fn1();// Hello Worldi am fine;

 

二 函数通信在递归中的应用

1 递归调用函数之间通过参数传递

技术分享

可以看到,每调用一次函数,会在栈上面开辟一个栈帧保存当前函数的实参(这里就是n的每一次具体值),并且函数之间都不相互干扰,当最后一个func(1)的时候函数才正真返回,因为函数返回的必然是call指令的下一条指令,所以,当func(1)返回的时候其实是回到了jmp func+33这条指令,但是这又是以一条跳转指令,所以,其实返回之后什么也没做直接就返回func(1)的值。

2返回值

技术分享

从这段汇编语言可以看出,函数的局部变量n保存到各自的栈帧中(ebp+8就是实参的位置),互不影响,只有当函数返回的时候,它才被取出来和前一个func(n-1)相乘,这就是典型的参数传递。同时,也通过返回值保存了func(n-1)的值。与上面的代码不同的是,这里递归栈中还保存了n,这里利用了0x8(%ebp)保存了上一次计算结果,这也就是return语句的作用

 

函数通信和递归详解

标签:

原文地址:http://www.cnblogs.com/bdbk/p/5123123.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!