声明式函数:
function 函数名(){
}
声明式函数,可以在定义函数之前调用,也可以在定义函数之后调用
赋值式函数:
赋值式子创建函数调用的时候只能在函数之后调用
函数运行的结果可以赋值给一个变量。
var 函数名=function(){
}
//同一个文档下不要出现相同的函数名,否则下面的函数会覆盖到上面的函数。
//可以赋值使用
function sums(num1,num2){//参数 形式参数
document.write(num1+num2);
}
sums(100,200);//实际参数
sums(50,60);
sums(1,9);
alert(sums(666,888));//underfined 因为sums仅仅是打印
//返回值,没有将结果给到我们
内存的运行机制:
内存分为:栈内存、堆内存
栈内存--存放基本数据类型,函数名在栈内存
堆内存--存放复杂数据类型、引用数据类型,函数体在堆内存
函数定义阶段
第一步,先在堆内存中开辟空间
第二步,把函数体内的代码原样复制到内存空间内,我们写代码,写在硬盘上。
第三步:把内存的地址 赋值给栈内存的函数名
函数:声明函数,调用函数---声明式函数、赋值式函数
--函数调用阶段(熟练记忆):
按照函数名存的地址找到对应的函数体
先判断栈内存中是否有这个变量
如果存在这个变量,也会判断,你这里面存储的是否是一个函数体
在调用栈内存开辟一个新的函数执行空间
在执行空间内,给形参赋值
对函数体内的代码进行预解析
对函数体内的代码,执行一遍
完成以后 这个执行空间被销毁或者理解为空间被收回
作用域:
<script>
//全局作用域
//一个html打开这就是一个全局作用域
//=>window(了解)
//局部作用域 私有作用域
//只有函数才有if while do while for他们都没有局部作用域
//作用域的上下级关系
//定义在那个作用域内的函数 就是那个作用域的子级作用域
// function test(){
// function haha(){
// }
// }
//变量的定义
//定义在那个作用域下 这个变量就是那个作用域的私有变量
//只能在这个作用域下或者这个作用域的子级作用域内使用
//不能在父级作用域使用=>
function test(){
var haha=666;
}
alert(haha)
//变量的访问
//首先在自己的作用域查找 如果有 那么直接使用
//如果没有自动到父作用域查找 父作用域有 那么就使用
//如果还没有 再往上一级 直到全局作用域 发现还没有 那么 报错
//xx is not defined
//变量的赋值
//现在自己的作用域内部查找 如果有直接赋值
//如果没有自动到父作用域查找 父作用域有 那么就使用 停止查找
//父作用域如果没有再往上到父级 直到全局作用域 发现还没有 那么 报错
//xx is not defined
var a=10;
var b=a;
</script>
递归:
10!(阶乘)10以内的阶乘
function fn(num){
if(num==1){
return 1;
}
return num*fn(num-1);
}
console.log(fn(4));
注意:递归也是有限制的,不能无限次的调用自己