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