JavaScript函数
函数基本概念
函数就是一段可以重复使用的代码块,用于完成特定的功能,能执行任意次。
函数是一个Function类型的对象,他有自己的属性和方法。包括两个重要的内置属性。
- arguments 函数的参数
- this 调用上下文
JavaScript是一门函数式编程语言,他的函数既是语法也是值,能作为参数传递给一个函数,也能作为一个函数的结果返回。
函数的执行离不开作用域,构建出的闭包,也要借助作用域才能解决许多棘手的问题。
作用域链
每个函数都有自己的作用域,而一个函数可以嵌套另一个函数,相当于一个作用域能关联另一个作用域,作用域之间相互关联就像一条锁链将他们链接在一起,而这条锁链就是作用域链,其最顶层是全局作用域。作用域链能够保证变亮有序的访问,在作用域链中搜索变量的具体过程如下。
- 从作用域首部开始查找,也就是调用变量时所处的作用域。
- 如果比配到指定的名字的变量,就停止搜索,取得变量的值,否则转到上级作用域中,继续搜索。
- 如果一直没有匹配上,那么所搜将持续到全局作用域,如果全局作用域也没有找到,那么说明该变量尚未声明,终止搜索。
函数的创建方式
- 函数声明
function funcName () {}
最好不要在。块级作用域使用函数声明 if、for语句中。 - 函数表达式
let funcName = function () {}
。
变量提升
函数声明存在提升,函数声明的优先级高于变量声明。
this 调用上下文
this的指向依赖与函数的调用方式。
总共有四种方式调用JavaScript中的函数:
- 普通函数:作为普通函数调用时,this会指向全局对象(window),但在严格模式中,this的值是undefined。
func() // 普通函数
- 对象方法:作为对象的方法被调用时,this会指向调用方法的对象。
obj.func() //对象方法
- 构造函数:作为构造函数被调用时,与new运算符组合使用会创建一个新的对象,this会指向这个新的对象。
new func() // 构造函数
- 间接调用:通过函数的方法
apply()
、call()
进行间接调用,可自定义this的指向。func.call(obj) // 间接调用
函数的参数
函数名和形参名都不能定义为arguments。
函数的参数分为两种。
- 形参:函数定义时的参数叫做形参。
- 实参:函数调用时传入的参数叫做实参。
注意:形参和实参的个数可以不想等。
函数内部有特殊的对象:arguments,这是一个数组对象,管理这实参列表。通过数字索引获取对象位置的参数,可以使用length属性,获取传入实参个数。
函数的重载
函数的重载:函数名称相同,参数不同,根据参数的不同,去执行不同的操作
由于JavaScript中同名函数不会用形参个数进行区分,所以JavaScript中没有重载,如果定义了两个相同的函数名,后面的函数会覆盖前面的
函数的属性和方法
属性:length:希望接收到的参数的个数
方法:
- call() 第一个参数设置this指向,后面接受任意多个实参
- apply() 第一个参数设置this指向,后面接受实参数组
- bind() 第一个参数设置this指向,后面棘手任意多个实参,返回值是一个绑定指定对象的新函数
call和apply最大的好处就是扩充函数说依赖的作用域,让要调用的方法和对象之间解藕
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。