I G U P
web爱好者
Copyright©2018 by igup

递归和预编译

1: 递归(计算n的阶乘经典案例)

题目: 计算n的阶乘
思路: n的阶乘其实就是 n*(n-1)*(n-2)* … *1;
递归函数实现过程: ( 递归函数是比较慢的,一般用的少 ,因为在无限的执行当前函数 )
1: 找规律
2: 找出口,否则会形成死循环
function test(n){
if(n==1){
return 1; //只有当n的值为1的时候 返回的值为1 这个为此递归函数的出口

//因为当n==1的时候test(n-1)   其实就是test(0)
}
return n*test(n-1); //递归函数实现n的阶乘的规律
}
console.log(test(5));     //值为120

 

2:预编译

js函数执行的过程总共分为3部:
1: 全局通读(查找是否有低级的错误存在,比如:符号 , 括号…)
2: 预编译(将代码的执行顺序捋清执行顺序)
3:将捋清的顺序从上到下解释一行,执行一行

函数预编译4部曲:

1: 创建AO对象(Area Object局部对象)
2:找形参和变量声明, 并将形参名和变量名作为AO对象的属性名, 并且他们的值为undefined (形参和变量)
3:将实参值和形参统一 (实参)
4: 在函数体里面找函数声明, 值赋予函数体

解释: 预编译发生在函数执行前一刻.  其实函数预编译开始之前先创建的是一个GO对象(Global object全局对象), GO对象和AO对象的预编译过程是一样的(只是不存在形参,实参) , 只是执行完GO对象之后, 在函数被执行之前 执行的AO对象会被提身至scope对象的第一位.   即函数执行之后会现在AO里面找, 如果没有则会在GO里面去找到自己需要的东西.

scope:   其实scope可以理解为一个函数执行前预编译产生的一个对象. 对象里面存放GO和AO对象, 在函数执行开始的时候, AO的执行顺序会被提升到第一位.  当一个函数整个执行完毕之后 , 当前函数临时产生的scope对象将会被销毁掉.

var a=111;

function test(a){

function a(){}   //函数声明

console.log(a); //function a (){}

var a=123;

console.log(a); //123

var a= function (){}    //变量函数声明
console.log(a);     //function   和上面的函数声明不一样

}

test(1)

console.log(a)  //111

2018-07-17
文章归档:

说点什么

  Subscribe  
提醒