JS函数声明及函数表达式相关
函数是什么
把一些代码语句进行封装,通过调用的方式来使用,执行里面的语句。可以把函数看做一个工具,可以直接拿来用的东西,避免了重复性的工作。
一个简单的函数:
为什么要用函数
-
将大量重复的语句写在函数里,以后需要这些语句的时候,可以直接调用函数,避免重复劳动。
-
简化编程,让编程模块化。
-
大量的功能都需要封装实现,函数是必须的。
函数怎么用
函数声明与函数表达式
函数声明举例:
-
函数的形参:a,b
-
函数的实参:1,2
-
注意:实际参数和形式参数的个数,要相同。
-
return的作用是结束方法。该函数会在return语句之后停止并立即退出.
函数表达式举例:
两则的区别:
-
函数声明会率先读取,函数调用可以放在前后都可以。
-
函数表达式必须要等到执行到它所在的代码行,才会被解释调用,因此调用必须放在表达式后面。
预编译
四部曲,预编译可以解决函数执行问题
-
创建AO对象
-
找形参和变量声明,将变量和形参名作为AO属性名,值为undefined
-
将实参值和形参值统一
-
在函数体里找函数声明,值赋予函数体
this
this指的是,调用函数的那个对象。this永远指向函数运行时所在的对象。
解析器在调用函数每次都会向函数内部传递进一个隐含的参数,这个隐含的参数就是this。
根据函数的调用方式的不同,this会指向不同的对象:【重要】
-
1.以函数的形式调用时,this永远都是window。比如fun();相当于window.fun();
-
2.以方法的形式调用时,this是调用方法的那个对象
-
3.以构造函数的形式调用时,this是新创建的那个对象
-
4.使用call和apply调用时,this是指定的那个对象
需要特别提醒的是:this的指向在函数定义时无法确认,只有函数执行时才能确定。
伪数组arguments
-
命名的参数只是提供便利,但不是必须得,arguments对象可以和命名参数一起使用。
-
arguments代表的是实参。有个讲究的地方是:arguments只在函数中使用。
-
arguments的值永远与对应命名参数的值保持同步。
-
arguments对象的长度是由传入的参数个数决定的,不是由定义函数时的命名参数的个数决定的。
-
没有传递值的命名参数将自动被赋予undefined值。
-
返回正在执行的函数:arguments.callee。在使用函数递归调用时,推荐使用arguments.callee代替函数名本身。
-
arguments是伪数组,是因为:arguments可以修改元素,但不能改变数组的长短。
重载
重载,简单说,就是函数或者方法有相同的名称,但是参数列表不相同的情形,这样的同名不同参数的函数或者方法之间,互相称之为重载函数或者方法。
-
ECMAScript没有重载,由于不存在函数签名
-
ECMAScript如果定义了两个名字相同的函数,则该名字只属于后定义的函数。
-
模仿重载:可以通过检查传入函数中的参数数量和类型并实现不同功能
函数的属性和方法
每个函数都包含两个属性:
-
length: 表示希望接收命名参数的个数
-
prototype: 非常重要的,很多方法都保存在prototype名下
每个函数包含两个非继承的方法:
-
apply(): 接收两个参数,一个是在其中运行函数的作用域,二是参数数组(可以是Array实例,也可以是arguments)
-
call(): 第一个参数是this没有变化,变化的是其余参数直接传递给函数。
两个方法的用途都是在特定的非作用域中调用函数,实际上等于设置了函数体内this对象的值。
他们两个的区别就在于接收参数的方式不同。
ps: 具体怎么选择需要考虑传入的参数,怎么方便怎么来
此外两个方法真正强大在于可以扩充函数赖以运行的作用域,对象不需要与方法有任何耦合关系。
此外es5还定义了一个bind( )方法,创建一个函数的实例,其this指向会被绑定传给bind( )函数的值。