函数2
作用域
-
全局作用域 : 执行语句执行的环境,是所有可访问变量,对象,函数的集合.
- 位置:变量定义在script标签内,函数外部的区域,具有全局作用域,在全局作用域里的变量可以在任何地方访问到。
- 生命周期:打开一个页面就出现了一个全局作用域,页面关闭即销毁。
- 全局作用域中有一个叫window的对象,可以直接访问的。
-
局部作用域 : 函数中声明 的 所有可访问变量,对象,函数的集合
- 位置:定义在函数内部,拥有局部作用域,变量只能在函数内部访问,函数外部访问不到。
- 生命周期:函数调用时产生,函数调用结束时销毁。
-
其他:
- 不声明直接赋值的变量默认全局变量。
- 函数里优先访问局部变量,没有再访问全局变量。(访问和赋值优先找局部变量,没有的话找上一级)
递归
函数内部直接或者间接调用函数,没有出口会造成死递归(栈溢出、内存溢出)
-
利用return来制造循环
// 计算n! function getNum(n) { if (n == 1 || n == 0) { return 1; } return n * getNum(n - 1); } document.write(getNum(+prompt('请输入一个数字')));
-
利用函数嵌套与调用制造循环
// 计算1+2+3+4+5 function add(n) { if(n === 5) { return 5; } else { return n + add(n + 1); } } add(1);
预编译
-
js引擎:执行js代码前,找到声明的变量和函数(变量/function),并把它们提前。
-
预编译
- 预编译 : 在一个作用域中 , 代码在执行前,会先进行全局的预解析 .
- 预编译内容 : 声明的变量 , 声明的函数 .
- 注意点 : 赋值运算不属于预编译
var num = function(){}; // 不属于函数预编译
-
顺序
1.先把变量/参数提前
2.给参数赋值
3.给函数声明(函数优先级最高)