JavaScript入门(三):JS函数

JS函数
函数也是一个对象,对象能做的事他都可以做
不同于普通对象的是,在函数中可以保存一些可以执行的代码语句,并且在需要时对这些代码进行调用
- 基本语法
- 函数的创建:
1. 以函数声明的方式
function 函数名([形参1,形参2,…..形参N]) {
代码语句…
代码语句…
}
2. 以函数表达式的方式
var 函数名 = function([形参1,形参2,…..形参N]) {
代码语句….
代码语句….
};
- 使用typeof检查一个函数对象时会返回function,function 是一种特殊的对象类型
- 函数的调用:
函数调用就是将函数中封装的代码执行
语法如下
函数对象()
例如:sum(512, 1024);
- 参数
实参&形参:
- 形参(形式参数)
函数声明和定义时使用的变量称为形参,形参的目的是用来接收调用该函数时传递的值
- 实参(实际参数)
函数调用时使用的变量称为实参,实参必须是一个确定的值,以便将这些值传递给形参
回调:
函数的参数可以是任意数据类型,
需注意的是当参数为函数对象时,我们称该函数对象为回调函数。
回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应
- 返回值
返回值就相当于函数的执行结果,在函数执行完毕以后可以通过一个变量来接收返回值
通过 return 关键字来指定函数的返回值,比如:return 250;
- 立即执行函数
(function(){})()
这种格式的函数,称为立即执行函数,声明完成后会立即被调用,且只会执行一次
- 作用域(难点)
作用域:
作用域简单来讲就是变量的作用范围,在JS中作用域分成两种:全局作用域和函数作用域
- 全局作用域(global scope)
全局作用域在页面打开时创建,在页面关闭时销毁,所有在script标签中直接编写的内容都在全局作用域中
在全局作用域中创建的变量和函数,在页面中的任意位置都可以访问
在全局作用域中有一个全局对象window,window代表的是整个的浏览器的窗口
在全局作用域中创建的变量都会作为window对象的属性保存;
在全局作用域中创建的函数都会作为window对象的方法保存
- 函数作用域
每调用一次函数就会创建一个新的函数作用域,函数作用域在函数调用时创建,在函数调用结束时销毁
在函数作用域中可以访问全局变量,在全局作用域中无法访问函数作用域中的变量
当在函数作用域中使用一个变量时,它会先在自身中寻找,如果找到了则直接使用;
如果没有找到,则继续向上一级作用域中寻找,如果找到了则使用,没找到则继续;
直到找到全局作用域了,如果依然没有,则会报错。
函数寻找变量的范围形成了一个作用域链(scope chain)
声明提前:
在全局作用域中或函数作用域中,如果使用var关键字声明了变量,则变量的声明操作将会在所有的代码执行前进行,但是不会赋值
在全局作用域中或函数作用域中,如果使用函数声明的形式创建函数,则函数会在当前作用域中的代码执行前被创建
1. JS检查装载阶段
函数的形参 -> 变量声明 | 函数声明(优先)
2. JS执行阶段
函数赋值 -> 变量赋值
闭包:
所谓的闭包就是当函数在其它地方使用的时候能保存下函数所需要的运行环境,也即是函数能保存下函数诞生时的环境
因此,闭包函数运行在它们被定义的作用域里,而不是它们被执行的作用域里
this:
- 这是一个函数调用中隐含的参数,代表的是函数执行的上下文对象,即方法的调用者!
- 在JS中,根据函数的调用方式不同,this的值也不同
1.以函数形式调用时,this是window对象【 ! 】
内嵌函数作为代码语句调用执行,因此,它的调用者也是window对象
2.以方法的形式调用时,this是调用方法的对象
3.以构造函数的形式调用时,this是新创建的那个对象
- 构造函数
- 构造函数是专门用来创建对象的函数,它本质上就是一个普通的函数,但是调用时需要使用new关键字
- 构造函数的执行流程:
1. 创建一个新的对象
2. 将新的对象设置函数的this
3. 执行函数中的代码
4. 将新建的对象作为返回值返回
通过一个构造函数创建的对象,我们称这个对象是这个构造函数(类)的实例
通过相同的构造函数创建的对象,我们称为一类对象
使用 instanceof 运算符可以用来检查一个对象是否是一个类的实例
- 原型
- 原型对象(prototype)
1. 每一个函数中都有一个默认属性prototype,该属性对应着一个【原型对象】
2. 如果函数作为普通函数调用时,则该对象没有任何作用
3. 如果函数作为构造函数调用时,则使用该函数所创建的对象中,都会有一个隐含的属性proto指向该函数的prototype对象
4. 默认情况下,所有的通过同一个构造函数所创建的对象,它们的原型对象是相同的
- 原型对象的作用:
- 当我们调用对象中的一个属性或一个方法时,它会先在对象自身中寻找,如果有则直接使用;
- 如果没有则去对象的原型中寻找(proto),如果找到了则使用;
- 如果没找到则去对象的原型的原型中寻找(proto.proto),以此类推;
- 直到找到Object的原型,它的原型没有原型(即为NULL),如果依然没有找到,则返回undefined。
- 原型链:
原型链是针对构造函数的。如上所述,对象查找某个指定的属性或方法时,始终遵循原型向上查找的规则,这样查找的范围就形成一个原型链(prototype chain)
原型链可以间接实现类的属性与方法的继承效果

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章