一:函数声明
函数声明,重要特征就是函数声明提升。
sayHi()
function sayHi(){
console.log("hi");
}
二:函数表达式
函数表达式的几种不同语法形式
- 匿名函数:创建一个函数并将它赋值给变量。function关键字后面没有标识符。 ```javascript var functionName = function(arg0,arg1,atg2){ //函数体 }
sayHi() //错误 函数还不存在 var sayHi = function(){ console.log(“hi”) }
关键点:理解函数提升,也就是理解函数声明和函数表达式之间的区别
不要这样写,错误示例。原因:这在ECMAscript中属于无效的语法,js引擎通常会尝试修正错误,将其转换为合理状态,问题是浏览器的做法都不一致。
```javascript
if(condition){
function sayHi(){
console.log("hi")
}
}else{
function sayHi(){
console.log("yo")
}
}
正确写法
函数表达式的写法不会导致它提升
var sayHi
var condition = 1
if(condition){
sayHi = function(){
console.log("hi")
}
}else{
sayHi = function(){
console.log("yo")
}
}
sayHi() //hi
7.1递归
递归函数是一个函数通过名字调用自身的情况下构成的,
function factorial(num){
if(num<=1){
return 1
}else{
return num*factorial(num-1)
}
}
arguments.callee 是一个指向正在执行的函数的指针,因此可以用它来实现对函数的递归调用
function factorial(num){
if(num<=1){
return 1
}else{
return num*arguments.callee(num-1)
}
}
另一种方式
var factorial = function f(num) {
if (num <= 1) {
return 1;
} else {
return num * f(num - 1);
}
};
7.2闭包
闭包是指有权访问另一个函数作用域中的变量的函数。
创建闭包的常见方式就是在一个函数内部创建另一个函数。
闭包与变量
作用域的这种配置机制引出了一个值得注意的副作用,即闭包只能取得包含函数中任何变量的最后一个值。
闭包保存的是整个变量对象,而不是某个特殊的变量。