1.递归
特点:符合思维逻辑,代码简单,但耗费时间空间复杂度注意事项:1.找规律,2.找出口
2.预编译
js三部曲:语法分析,预编译,解释执行
2.1预编译特点:
- 函数声明整体提升(所有函数声明提升到最前面)
- 变量 声明提升 (变量声明在赋值之前)
b=10; var b; 不会报错,b值为undefined
- imply global暗示全局变量
即任何变量未经声明就进行赋值,则为全局变量
例:a=10; 可用window.a进行访问
- 一切声明的全局变量,都是window属性,即都可用window.变量名进行访问
2.2预编译步骤:
- 创建GO对象(执行3,4,5)
- 创建AO对象(执行3,4,5)
- 找形参和变量声明,将形参和变量作为AO属性名,值为undefined
- 将实参值和形参值统一
- 在函数体里面找函数声明,将值赋给函数体
2.3例子
function fn(a) { console.log(a); var a = 123; console.log(a); function a() { } console.log(a); var b = function () { }; console.log(b); function d() { } } fn(1); /** * 1.创建AO对象 * AO{} * 2.找形参和变量声明,将形参和变量名作为AO对象的属性名,值为undefined * AO{ * a:undefined, * b:undefined * } * 3.将形参和实参统一 * AO{ * a:1, * b:undefined * } * 4.寻找函数声明,并将值赋给函数体 * AO{ * a:function a{}, * b:undefined, * d:function d{} * } * * * */
/** * 1.创建GO * GO{} * 2.寻找变量声明,将变量名称作为GO 的属性名,值为undefined * GO{ * a:undefined * } * 3.将实参和形参统一 * GO{ * a:100 * } * 4.寻找函数声明 * GO{ * a:undefined, * demo:function demo{} * } * 5.创建AO对象 * AO{} * 6.寻找形参和变量声明,将形参和变量名称作为AO的属性名,属性值为undefined * AO{ * e:undefined, * a:undefined, * c:undefined, * b:undefined * } * 7.将形参和实参统一 * AO{ * e:1, * b:undefined, * a:undefined, * c:undefined, * f:undefined, * } * 8.寻找函数声明,将值赋给函数体 * AO{ * e:function e {}, * a:undefined, * b:undefined, * c:function c{}, * f:undefined * } * 9.执行后 * AO{ * e:2, * a:10, * b:undefined, * c:undefined, * f:123 * } * */ a = 100; function demo(e) { function e() { }; arguments[0] = 2; console.log(e); if (a) { var b = 123; function c() { }; } var c; a = 10; var a; console.log(b); f = 123; console.log(c); console.log(a); } var a; demo(1); console.log(a); console.log(f);