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( )函数的值。

posted @ 2018-09-09 15:24  沉浮乡土  阅读(254)  评论(0编辑  收藏  举报