函数实例实际上是对象!每个函数都是FUNCTION类型的实例,与其他引用类型一样具有属性和方法,因此函数名实际上就是一个指向函数对象的指针,并不与函数绑定。
1.函数声明的两种方法:
1)函数声明式
function sum(num1,num2){}
2)函数表达式
var sum=function(num1,num2){};
其实还可以使用Function构造函数,不过一般不用。
2.函数没有重载
后声明的函数覆盖先声明的函数,因为函数名只是一个指针,你可以让它指向不同的对象。
3.函数声明与函数表达式的区别
解析器会先读取函数声明,是一种函数声明提升,而函数表达式直到解析到它所在的代码时才会真正解释执行。
4.函数本身就是一个对象,没什么特别,完全可以当做一个值一样传递。
5.函数内部属性
arguments前面聊过了,主要来说说this,this引用的是函数执行的环境对象——或者也可以说是this值,全局作用域中就是window。简单说,就是谁调用函数,函数里的this就指向谁。
6.函数属性和方法
每个函数都有length和prototype方法,其中length属性表示函数希望接受的命名参数的个数。
prototype是函数的原型,prototype对引用类型来说,都是保存他们所有实例方法的所在,比如toString实际上是保存在原型下的,只是通过实例来访问罢了。
原型是不能用for-in枚举的
每个函数都包含两个非继承而来的方法,apply和call,这两个方法是用来在特定的作用域中调用函数,实际上等于设置函数体内的this值,apply方法接收两个参数,一个是在其中运行函数的作用域, 另一个是参数数组。call的区别在于它的参数必须一个一个列举出来。二者最重要的作用是扩充函数运行的作用域。这种方法的好处是,对象和方法不需要关联,不需要把方法绑定成对象的属性就可以在这个对象上调用这个方法 。
除此之外,还有一个bind方法,该方法会返回一个新的函数,这个新的函数绑定了bind指定的作用域,无论在何处调用,this都指向bind绑定的对象。