7_1 函数表达式 > 递归
2019-08-28 本文已影响0人
诺诺诺诺Daddy
//定义函数的方式有两种:函数声明 和 函数表达式
//函数声明的方式
function good (arg0,arg1,arg2){
//函数体
}
// 通过方法名可以获取到function的名字
console.log(good.name);//good
//函数声明方式创建函数的一个重要特征就是"函数声明提升", 意思是执行代码之前会先读取函数声明,意思就是可以吧函数声明放在调用语句后面
fn1();//1
function fn1(){
console.log(1);
}
//函数表达式方式 包含几种方式,下面是最常见的一种
var noName = function(arg0,arg1,arg2){//赋给变量的函数也叫匿名函数,函数表达式不会发生"函数声明提升"
//函数体
}
// fn2();// fn2 is not a function
var fn2 = function(){
console.log("匿名函数")
}
//下列这种写法很危险, 大多数浏览器都会返回第二个声明. 忽略条件语句, 如果替换成函数表达式就不会有问题了
var y = false;
if(y){
function sayHi(){
alert(1)
}
}else{
function sayHi(){
alert(2);
}
}
// sayHi();
//函数表达式写法
var sayHi;
var y = false;
if(y){
sayHi = function(){
alert(1)
}
}else{
sayHi = function(){
alert(2);
}
}
//递归
function factorial(num){
if (num <= 1){
return 1;
} else {
return num * factorial(num-1)
}
}
// factorial(10);
var anthorFactorial = factorial;
factorial = null;
alert(anthorFactorial(4));//factorial is not a function 报错; 因为递归里写死了factorial方法, 所以当factorial变成null时就会报错,可以用 arguments.callee来解决
// arguments.callee是指向一个正在执行的函数的指针
function factorial(num){
if(num<=1){
return 1;
}else{
return num* arguments.callee(num -1);
}
}
var anotherFactorial = factorial;
factorial = null;
anotherFactorial(4);//不会报错
//严苛模式下, 不能通过脚本访问arguments.callee();访问这个属性会导致错误;那么可以用命名函数的方式来解决
function factorial(function f(num){//这种方式在严格模式和非严格模式下都行得通。
if(num<=1){
return 1;
}else{
return num * f(num-1);
}
})