Javascript--关于函数

290 阅读7分钟

函数的作用

通过函数可以封装任意多条语句,而且可以在任何地方,任何时候调用执行。


函数的定义

函数使用function声明,后跟一组参数以及函数体

语法:

function functionName([arg 0,arg 1,...arg n]){
    statements
}

说明:

  1. functionName是要定义的函数名,属于标识符,要符合标识符的定义规则
  2. []内的内容为函数的参数
  3. []说明里面的内容不是必须的,他不是语法,若没有参数需要传递,则无需写参数

函数的调用

语法:

函数名([arg 1,arg 2,...arg n])

举个栗子


函数的返回值

任何函数通过return语句,后面跟着返回的的值来实现返回值(与c语言类似)

这个简单例子中,使函数返回值为sum,在后面的调用中直接使用,同样也可将函数返回值赋给新的变量在后续进行使用,return同样也可以无返回值

说明:

  1. 函数会在执行完return语句之后停止并立即退出
  2. return语句也可以不带有任何返回值,用于提前停止函数执行又不需要返回值的情况

函数中的参数

不在意参数个数以及类型

arguments

ECMAScript中的参数在内部用一个数组来表示,在函数体内通过arguments对象来访问这个数组参数

说明:

  1. arguments对象只是与数组类似,并不是Array(数组)的实例
  2. []语法访问它的每一个元素
  3. length属性确定传递参数的个数

使用方法与c语言中数组类似

当使用arguments在函数体中改变了传入参数的值时,则打印结果会改变为改变后的值

严格模式(补充)

参考文章: www.cnblogs.com/karthuslori… 以及 www.cnblogs.com/zhonghongli…

严格模式使js在严格的条件下运行,在该模式下,很多原本不会报错的代码会报错并组织运行,例如:js中的饮食创建全局变量会被阻止运行

好处:提高了代码的健壮性

用法

在进入严格模式的作用域开头输入"user strict"

小栗子:求平均值


函数的对象

参考文章:

www.runoob.com/js/js-objec…

www.jb51.net/article/157…

Javascript中的所有事物都是对象(包括 字符串、数值、数组、函数...)并且JavaScript中允许自定义对象

对象是一种特殊的数据,拥有属性和方法

对象创建

函数对象的使用与c语言中结构体类似,在变量中声明多个属性,同时还可包含函数以及对象

在Javascript中变量声明为全局变量,当变量数量多的时候,全局变量的挨个声明会导致代码繁琐,并且起名困难,使用对象更加方便且不易出错,故在js使用过程中应该尽可能少的使用全局变量

直接创建

注意事项:

  • 对象中的各个属性之间用逗号隔开
  • 最后一个属性后不需要加逗号
  • 对象中的属性可以添加函数,也可添加对象

函数构造创建

构造函数需要以一个大写字母开头,非构造函数以小写字母开头

构造函数本身也是一个函数,只是用来创建对象

补充:

instanceof+构造函数名 :测试一个对象是否为一个类的实例

访问对象的属性

可以通过

对象名.属性名

对象名['属性名']

这两种方式对 对象 中的属性进行访问,可以重新进行赋值也可添加或删除某个属性

这时控制台打印的内容为后赋的值

添加与删除

判断属性是否存在于这个对象中,并将结果打印在控制台

console.log('属性名' in 对象名);

若存在,则返回true,若不存在,返回false

枚举(将属性值全部打印在控制台)

for in 语句:
for (var p in 对象名)//声明一个变量p,用来存放访问的属性名

在访问属性值的时候不可以用'.'这种写法,应使用'[]',[]会对括号里的内容进行计算,而点会返回undefined


函数补充

window.unload(无函数名的函数,即匿名函数)

文章参考: www.runoob.com/w3cnote/jav…

补充:

window.onload()

用于在网页加载完毕后立刻执行的操作,即当 HTML 文档加载完毕后,立刻执行某个方法。

JavaScript 中的函数方法需要在 HTML 文档渲染完成后才可以使用,如果没有渲染完成,此时的 DOM 树是不完整的,这样在调用一些 JavaScript 代码时就可能报出"undefined"错误。

注意

  • 函数可以调用
  • 函数也是对象
  • 当变量名与函数名同时设置给某个函数时,舍弃函数名

函数三种定义

字面量定义

  • function声明
function 函数名(形参){
    函数体
}
  • var赋值表达式
var 变量名 = function (形参){
    函数体
};

因为是赋值表达式,故函数定义完之后要加分号

构造函数

参考文章:

www.jianshu.com/p/95a5faee1…

在Javascript中,用new关键字来调用的函数,称为构造函数

作用: 在使用对象字面量创建一系列同一类型的对象时,这些对象可能具有一些相似的特征(属性)和行为(方法),此时会产生很多重复的代码,而使用构造函数就可以实现代码的复用。

先构建函数:
function 函数名(参数){
    this.属性名 = 参数;
}

再使用new对其调用:(使用字符串传递参数)
var 变量名 = new 函数名(实参);
  1. 当new关键字调用时,会创建一个新的内存空间,标记为该函数的实例
  2. 函数体内部的this指向该内存
  3. 执行
  4. 返回this

关于this: www.cnblogs.com/jiayuexuan/…

区别

使用function声明定义函数时,函数的调用写在定义前后无所谓,但赋值语句中不可写在前方,由于function会进行预解析,在执行语句之前,将var 与 function提取到最前,先行执行。

一般不使用构造函数定义函数,而用他定义对象

调用

匿名函数

匿名函数不要让function开头

  • 将调用后的函数赋值给变量
  • 在函数前添加!+-等符号
  • 给函数整体添加括号括起来
  • 在打印台直接使用

递归调用

自己调用自己

方法调用

方法:对象与函数相结合

在对象中的属性值为函数,即方法

当命名非法时,使用引号引起来

链式调用:

例:
$('p').html('段落').css('background-color','red')

函数的间接调用

每个函数都可以通过call和apply进行间接调用

当传入的参数形式为数组时,可以使用apply直接将数组传入,不需要用变量将数组中的值挨个取出再进行传参

可以在继承中使用call和apply,还可以借用其他对象的方法来完成操作,帮助判断一个数据的类型

关于参数

每个函数自带length属性

例: add.length,代表形参的个数

补充:

手动抛出错误:throw new Error('想输入的内容');

arguments

类数组,是一个类似数组的对象

每一个函数都有的,局部的

arguments与形参一一对应

arguments时独立的,每个函数都有属于他的arguments,互相之间没有联系

argument.callee指代函数体本身,严格模式下不允许使用

常用于递归当中

使用arguments,callee在递归当中,如果改变函数名称,对函数本身的运行没有影响

对象作为参数

当传入的参数过多且有顺序时,可以使用对象来作为参数,这样就不用在意形参中的顺序

返回值

  • return:一般用于函数末尾,表示最后的返回值,以及提前结束函数
  • continue:一般用于循环之中,表示跳出本次循环
  • break:用在循环中,表示跳出这个循环

返回值内容

  • 什么都不加
  • 数字
  • 字符串
  • null
  • 对象,函数