因为函数可以说是在JS编程中的占据核心地位,所以单独写个文章梳理一下函数知识,有错误或者理解偏差欢迎指正
个人理解,函数就是封装一些JS变量,表达式,语句的代码块,能指定输入和输出,在一些时机调用执行代码
创建函数的方式
-
函数声明
funtion funName(num){ alert(num) }
-
函数表达式
var funName = function(num){ alert(num) }
-
通过Function构造函数声明
传入的最后一个参数是函数体字符串,解析消耗性能,对于复杂的函数逻辑,写起来也复杂,因此不常用
var funName = new Function('num','return num')
函数声明和函数表达式的区别
函数声明具有
声明提前
的特点,也就是函数调用可以在函数声明之前,而函数表达式只 能先给变量赋值函数,再通过变量调用函数
//函数声明
fun()//正常执行
function fun(){}
//函数表达式
fun2();//会报错
var fun2=funtion(){}
函数没有重载
对于其他语言,声明两个同名函数,传不同的参数就相当于两个不同的函数,但是对于js函数,结果就不同了
function funName(){
alert(200)
}
function funName(){
alert(300)
}
funName()//300
上面代码声明了两个同名函数,调用函数,只执行了第二个,换成下面的写法容易理解为什么会这样了
var funName = function (){
alert(200)
}
funName = function (){
alert(300)
}
funName()//300
JS函数名只是函数的指针,声明同名函数,只是把这个指针重新赋值,所以函数没有重载入,可以通过传入的参数不同,在函数内部处理不同逻辑,实现重载入的效果
函数内部两个特殊对象
-
arguments
arguments对象是一个类数组,包含函数实际传入的参数,arguments又一个callee属性,指向当前函数
//递归时callee属性的应用 function factorial(num){ if (num <=1) { return 1; } else { return num * arguments.callee(num-1) } }
-
this
this是一个指针,指向函数运行时所在执行环境对象,对象
关于this的详细内容会单独写一篇文章梳理
函数的属性和方法
因为函数是对象,所以函数拥有属性和方法
函数的属性:
-
length 表示函数的形参数量
function funName(num1,num2){ } alert(funName.length)//2
-
prototype一个指针,指向函数的原型对象
原型的理解一章有详细说明
函数的方法:
- call()
- apply()
- bind()
以上三个方法用于改变this指向,扩展函数执行作用域,使函数与对象解耦
- toLocalString()
- toString()
- valueOf()
其中,toLocalString(),toString(),valueOf()是从Objetct继承来的
函数的一些特殊用法
- 作为值传递
- 递归调用
- 闭包