Javascript函数认识
①函数实际上是对象,每个函数都是Function类型的实例,具有属性和方法。
②函数是对象,故函数名实际是一个指向函数对象的指针,不会与某个函数绑定。
③函数定义三种方式:
a、函数声明:function a(){ … }
b、函数表达式定义 :var a = function(){ … }
c、Function构造函数:var a = new Function(a, b, c) //最后一个参数始终是函数体,不推荐,两次解析代码,影响性能
④函数名仅是指向函数的指针,与包含对象指针的其他变量无不同。【不带括号的函数名访问的是函数指针】
⑤函数名是函数的指针,故定义同名函数,后者会覆盖前者,所以js中没有函数重载的概念。
函数重载:多个函数用同一个名字,但参数表即参数的个数或数据类型可以不同,调用的时候,虽然方法名字相同,但根据参数表可以自动调用对应的函数。
⑥函数声明与函数表达式的区别:
a、他俩唯一的区别在于解析器在向执行环境中加载数据时,顺序不一样。
b、解析器先读取函数声明,并使其在执行任何代码之前可调用【声明提前】
c、函数表达式要等到解析器执行到它所在的代码行时,才会真正被解析执行。
d、函数声明提升过程,读取并将函数声明添加到执行环境中。
⑦js中函数名本身就是一个变量,故函数可做为值来使用:
a、将函数像传递参数一样传递给另一个函数
b、将一个函数作为另一个函数的结果返回
c、可以从一个函数中返回另一个函数
⑧在函数内部有两个特殊的对象:
a、arguments是一个类数组对象,包含传入函数中的所有参数,主要用途是保存函数参数。
【该对象有一属性callee,该属性是一个指针,指向拥有这个arguments对象的函数】
b、this引用的是函数据以执行的环境对象
【哪个对象调用函数,this就指向谁;函数名就一变量,故不管那个对象调用函数,func1()和o.func1()指向的都是同一个函数】
c、另一对象属性caller,保存着调用当前函数的函数引用
【B函数中调用了A,此时A.caller将指向B函数】
⑨函数的属性和方法:
a、每个函数包含两个属性:length和prototype
* Ⅰ. length:函数希望接收的命名参数的个数
* Ⅱ. prototype:保存所有实例方法的真正所在
b、每个函数都包含两个非继承而来的方法:apply()和call()作用都是在特定的作用域中调用函数,相当于设置函数体内this的值【扩充作用域】。区别仅在于接收参数的方式不同。
c、bind():创建一个函数的实例,this绑定到传给bind的函数的值
d、toLocaleString()和toString():返回函数的代码
e、valueOf():返回函数的代码
本文链接:javascript函数认识