几个概念
- 在js中,函数就是个对象
- 函数名就是个指向函数对象的指针
函数的三种声明方式
- 函数声明
// 语法
function sayName(name) {
console.log(name)
}
- 函数表达式
// 语法
var sayName = function(name){
console.log(name)
}
- 使用Fuction构造函数生成实例
// 前面都是函数参数,最后一个字符串参数表示函数体
var sum = new Function("num1", "num2", "num1+num2")
// 不推荐的原因:
// 1. 需要两层解析,一是函数解析,而是对内部字符串的解析,耗性能
// 1. 书写麻烦,函数体还不能写复杂
函数声明和函数表达式的区别
要理解它们的区别,先要知道几个概念
- 解析器,就是对js源码进行一定规则解析,然后交给执行环境执行
- 执行环境,js源码真正运行的环境
js解析器的规则有点特殊,有两个提升
- 变量提升,源码中声明的变量会被被解析器提取出来,在源码逐行执行前被执行,此时变量会被赋值为undefined
- 声明函数提升,声明函数会被整体提升到代码执行前,所以在声明函数之前就调用该函数,是不会报错的,因为该函数已经被提升到执行环境的头部了
总结:
- 函数表达式,只会提升它的变量,该变量为undefined,只有当代码执行该函数所在的位置时,该变量才会被真正指向该函数。所以在函数表达式之前的调用,都会导致脚本报错
- 声明函数会被提升,提前引用不会报错
函数的属性和方法
- 内部属性this和arguments
- this,表示调用函数的对象的引用
- arguments,函数参数组合而成的类数组
- arguments.callee,该属性指向该函数,做递归的时候很好用
- 函数本身的属性和方法
- length, 返回函数参数的个数
- apply()、call()、bind(), 用于函数继承并修改内部this指向,详情可以看我的另一篇介绍,蛮简单的。传送门