函数
//递归函数 function factorial(n){ if(n<=1){ return 1; } else { return n*arguments.callee(n-1); } } console.log(factorial(4));//24
函数作用域是指函数内声明的所有变量在函数体内始终是可见的,意味着变量在声明之前甚至已经可用,被称为声明提前,即函数里所有声明的所有变量(但不涉及赋值)都被提前至函数的顶部
全局变量在程序中始终都是有定义的。局部变量在声明它的函数体内以及其所嵌套的函数内始终是有定义的
函数声明语句和函数定义表达式的区别
二者都创建了新的函数对象,但函数声明语句中的函数名是一个变量名,变量指向函数对象,和通过var声明变量一样,函数定义语句中的函数被显示的提前到脚步或函数的顶部。因此它们在整个脚本和函数内都是可见的。使用var的话,只有变量声明提前了-变量的初始化代码仍然在原来的位置。然而使用函数声明语句的话,函数名称和函数体均提前;脚步中的所有函数和函数中所有嵌套的函数都会在当前上下文中其他代码之前,也就是说,可以在声明一个函数之前调用它。
for(variable in object)
statement
variable通常是一个变量名,也可以是一个可以产生左值的表达式或者一个通过var 语句声明的变量,总之必须是一个使用一个适用于赋值表达。式左侧的值。javascipt会议吃枚举对象的属性来执行循环,在每次循环之前,javascript都会先计算variable表达式的值,并将属性名(一个字符串)赋值给它。
只要for/in循环中variable的值可以当作赋值表达式的左值,它可以是任意表达式。每次循环都会计算整个表达式,也就是说每次循环它计算的值有可能不同.
for/in循环可以象枚举对象属性一样枚举数组的索引
var o={x:1,y:2,z:3}; var a=[]; var i=0; for(a[i++] in o); console.log(a);//["x","y","z"] for(j in a) { console.log(j) }//1,2,3
当break和标签一块使用时,程序将跳转到这个标签所标识的语句块的结束,或者直接终止这个闭合语句块的执行。当你希望通过break来跳出非就近的循环体或者switch语句时,就会用到带标签的break语句
continue在不同类型的循环中,行为也有所区别:
1、while循环中,在循环开始处指定的expression会重复检查,如果检测结果为true,循环体会从头开始。
2、在do/while循环中,程序的执行直接跳到循环结尾处,这时会重新判断循环条件,之后才会继续下一次循环
3、在for循环中,首先计算自增表达式,然后再次检测test表达式,用以判断是否执行循环体
4、在for/in循环中,循环开始遍历下一属性名,这个属性名赋值给了指定的变量
continue语句在while和for循环中的区别。while循环直接进入下一轮的循环条件判断,但for循环首先计算其increment表达式,然后判断循环条件
var i=0; while(i<10){ if(i==5){ i++; continue; } console.log(i); i++; } for(var j=0;j<10;j++){ if(j==5) continue; console.log(j); } var m=0; do{ if(m==5){ m++; continue; } console.log(m); m++; }while(m<10);
带标签的continue语句可以用在嵌套的循环中,用以跳出多层次循环嵌套的循环体逻辑