参数默认值
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) // undefined
var a = 10;
// 声明提升 ,赋值不提升
console.log(a)
function a (){ consoloe.log('a') }
var a = 10;
暗示全局变量 (全局域 都归window所有)
var a = 10
var b = 1
//全局window对象
console.log( window.a , window.b) // 10, 1
window {
a : 10,
b : 1
}
function test(){
var a = b = 1;
}
test()
console.log( b ) // 1 这种赋值方式直接在window对象上挂摘了
console.log( window.a) // undefined 只要是对象尚不存在的属性都是undefined
console.log( a ) // 报错
例子
function test(a,b){
console.log(a)
c = 0
var 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: undefined
d:function(){ }
}
2. Ao:{
a: 1 => 5 执行语句 赋值
b: function(){} => 6
c: undefined => 0
d:function(){ }
}