JS函数
JS函数的定义
函数的定义:
函数是计算机编程中非常重要的一个语法结构。那么什么是函数呢?函数指一组可以随时随地运行的代码集合,当他被调用时可重复的去执行这些代码集合。
类比数学中的函数:
数学中的函数指给定一个数集A,对A施加对应法则f,记作f(A),得到另一数集B,也就是B=f(A).那么这个关系式就叫函数关系式,简称函数。
函数声明
定义函数
JS中创建函数有三种方式:
- 函数声明
- 函数表达式
- 函数对象
1.函数声明
1 |
|
2.函数表达式
1 |
|
3.函数对象(了解)
1 |
|
关于函数声明及解析
1.函数声明会预解析(仅在当前所在的script块内)
1 |
|
2.函数表达式不具备预解析功能
3.变量解析要高于函数的预解析
1 |
|
4.函数表达式可直接调用执行
1 |
|
但函数声明是不能直接调用的
1 |
|
关于函数变量的区域性
程序寻找参数的时候只能够寻找和它同级或外层的变量,无法向内层找变量
1 |
|
变量提升问题
先甩一道经典变量提升题
1 |
|
问控制台打印的结果是多少?
思考
答案 : undefined
使用var
关键字声明的变量在JavaScript中会被提升,并在内存中分配undefined
,但初始化却发生在你给变量赋值的地方,另外var
声明的变量是函数作用域的
,所以上述代码块解析可以看做以下过程
1 |
|
上边的代码块理解了下边的代码块理解起来就很方便了
1 |
|
答案 : undefined
, 9
解析过程直接以代码形式呈现,看起来比较容易理解
1 |
|
JS函数参数
1 |
|
实参的个数和形参的个数不一定要一样
1 |
|
arguments
对象:表示实参的集合
arguments.length
: 获取集合长度
通过 []
获取集合数组的下标
1 |
|
关于JS中函数的参数
函数的参数属于函数的内部变量,外部无法访问到,即使和外部变量同名,它们也是两个不同的变量
1 |
|
类似于:
1 |
|
当函数没有定义参数或者内部没有var
变量,内部的变量默认为全局变量
1 |
|
当函数定义了参数,但没有传实参的时候,形参默认为undefined
1 |
|
但是如果通过对象传递参数,函数内部对象属性值发生改变,外部被传递对象的属性值也会改变
1 |
|
总结:通过值传递参数
: 在函数中调用的参数是函数参数(属于局部变量范畴),如果函数修改参数值,将不会改变外部被引用的实参值通过对象传递参数
:对象属性的变量是相当于指针,因此函数修改对象的属性值时,外部的对象属性也会改变。
这也涉及到基本类型和引用类型的值,基本数据类型(undefined、null、boolean、Number)是按值访问的,所以局部变量与全局变量即使名字一样,也是两个不同的变量总而言之
1.函数参数是被当做变量对待的
2.参数是按值传递的
3.传递参数的时候要确定传递的数据类型
对象属于引用类型,当变量是一个对象时,将这个变量赋给另一个变量时,相当于另一个变量也变为了指针;两个变量都指向同一对象;所以在引用数据类型照片中,变量相当于一个指针^[注:JavaScript高级程序设计第四章 变量、作用域和内存 有详细介绍]
return
返回值return
: 表示函数执行完的返回值,当函数没有写return
的时候,函数调用完就会变成undefined
然后return
;return
类似于跳出操作,所以return后的代码是不执行的
1 |
|
函数作用域和作用域链会单写一篇
函数与事件
JS事件
鼠标、键盘触发的一些功能(一些功能就是自己定义的函数,跟事件关联的函数叫做事件函数)
事件函数
onclick
: 点击(不只是鼠标,键盘也可以)ondbclick
: 双击onmousedown
:鼠标按下onmouseup
:鼠标抬起onmouseover
:鼠标移入onmouseout
:鼠标移出onmousemove
:鼠标移动(连续触发)
代码简化
举个栗子,以前我们获取元素的时候,需要下边这么多的代码
1 |
|
而如果我们把它封装到一个函数里,每次取元素的时候调用,不是方便多了
1 |
|
常用内置函数
alert()
提示框
1 |
|
confirm()
确定对话框
1 |
|
prompt();
输入对话框,返回值就是输入的内容
1 |
|
转换数字
这里简述两种方法parseInt()
,parseFloat()
parseInt()
将字符串转换成整数
1 |
|
parseInt()
会从左至右挨个转换直到不能转换为止
parseFloat()
将字符串转换成浮点数
1 |
|
isNaN()
判断是否是NaN,是返回true
,不是返回false
但是因为JS历史原因……还是有BUG的
1 |
|
很显然 hello 类型是字符串,不是NaN,但是为什么会返回true呢
看一眼 w3cschool对isNaN返回值的定义:
如果 x 是特殊的非数字值 NaN(或者能被转换为这样的值),返回的值就是 true。如果 x 是其他值,则返回 false。
也就是说程序内部会首先把hello转换成Number类型,自然就变成了NaN,然后再进行isNaN的判定。
ES6提供了一种更为严谨的判断是否是NaN的方法:Number.isNaN()
现在用这个新方法来判断一下hello是不是NaN
1 |
|
isFinite()
判断是否是无限数字,如果是有限数字返回true
,如果不是则返回false
Infinity:无限大
-Infinity:无限小
Math对象
Math.min()
:取最小值Math.max()
:取最大值Math.cell()
:向上取整Math.floor()
:向下取整Math.pow()
:平方Math.sqrt()
:开平方Math.abs()
:取绝对值Math.PI
:π值Math.random()
:随机一个 [0,1) 区间的数Math.round()
:四舍五入
如果我想要开三次方或者多次方怎么办
1
>Math.pow(8,1/3);//开8的三次方
举一反三
初探this关键字
这里只介绍this最简单的指向,即this
会指向当前事件所操作的元素