参数默认值
function test(a = 1 , b){console.log( a , b) // 1,2}test(undefined,2)function test2(a = undefined , b){console.log( a , b) // 1,2}test2(1,2)
优先选择有值的,这个是es6的特性,在es5以前都不可以,
递归
function fb(num){if(num === 1){ retunr 1}else {return num * fb(num - 1)}}fb(5)/** 可以理解为找入口和出口*/出口就是 有一个特定值的地方function fb(5){return 5 * fb(4)fb(4) = 4 * fb(3)fb(3) = 3 * fb(2)fb(2) = 2 * fb(1)fb(1) = 1}
function multiple(a){if(a < 2 ) {return 1}else if( a > 3){return multiple(a -1) + multiple(a - 2)}}// 分解为function multiple(5){return multiple(4) + multiple(3)multiple(4) = multiple(3) + multiple(2)multiple(3) = multiple(2) + multiple(1)multiple(2) = multiple(1) = 1}
预编译
1.检查通篇语法错误
1.5 预编译过程
2.解释一行,执行一行
AO:{
1.形参和变量 声明
2.实参值赋值给形参
3.寻找函数声明
4.执行函数
}
GO:{
1.声明变量
2.寻找函数声明
4.执行函数
}
console.log(a) // undefinedvar a = 10;// 声明提升 ,赋值不提升
console.log(a)function a (){ consoloe.log('a') }var a = 10;
暗示全局变量 (全局域 都归window所有)
var a = 10var b = 1//全局window对象console.log( window.a , window.b) // 10, 1window {a : 10,b : 1}
function test(){var a = b = 1;}test()console.log( b ) // 1 这种赋值方式直接在window对象上挂摘了console.log( window.a) // undefined 只要是对象尚不存在的属性都是undefinedconsole.log( a ) // 报错
例子
function test(a,b){console.log(a)c = 0var c ;a = 5;b = 6;console.log(b);function b(){}function d(){}console.log(b);}test(1)过程:1.Ao:{a:undefined => 1 形参赋值b:undefined => function(){} 函数声明 覆盖c: undefinedd:function(){ }}2. Ao:{a: 1 => 5 执行语句 赋值b: function(){} => 6c: undefined => 0d:function(){ }}
