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);