JavaScript 函数总体概述(函数声明/参数传递/返回值/加载/变量和作用域/变量声明提升/匿名函数/回调函数)



1.  函数的概念和定义
函数就是可以重复执行的代码块。

①  函数声明(自定义声明)
使用在定义之前或之后均可
function 函数名(形参) { }

②  函数表达式(匿名函数法)
注意:使用必须在定义之后
var 变量 = function(形参) { }


③  Function对象(构造函数法)
注意:使用必须在定义之后
var 变量 = new Function(程序);



2.  函数的参数
定义:参与运算的变量
作用:为了扩展函数的功能性,和与程序员的交互性,和代码的复用性
实参:实际参与运算的变量
形参:形式上参与运算的变量,为实参占位置

JavaScript中的函数相对于其它语言的函数比较灵(特)活(殊)。
在其它语言中实参个数必须和形参个数一致,但是JavaScript中没有函数签名的概念,实参个数和形参个数可以不相等。JavaScript中没有方法的重载。
① 实参个数 > 形参个数:函数正常执行,多余的参数不参与运算
② 实参个数 = 形参个数:函数正常执行
③ 实参个数 < 形参个数:未给定值的参数默认为undefined,是报错还是NaN还是无法执行,取决于函数内部的逻辑
function fn(a,b) {
    alert(a+b);
    //实参个数和形参个数
    console.log(fn.length);//打印:形参个数
    console.log(arguments); //打印:实参个数,arguments是一个对象(伪数组),装载着所有的实参,必须在函数内部使用
}




3.  函数的返回值
有return函数就有值,没有return函数就没有值。
函数内部的变量如果外部想要使用,必须用 return关键字返回,那么外部的变量才能接收。
总结:函数内部,return后面的值就是返回值
作用:函数执行后剩下结果就是返回值
alert("你好");//有参数,没有返回值
confirm("你好");//有参数,有返回值,点击确定返回true,点击取消返回false
prompt();//有参数,有返回值,点击确定返回输入内容,没写内容默认为空字符串,点击取消返回null

总结函数功能
- 有时候我们用的是函数的逻辑
- 有时候我们用的是函数的返回值
- 而函数的参数是为了提高函数的功能性存在的
函数的注意事项
 如果函数没有显式使用return语句,那么函数有默认的返回值:undefined
② 如果函数使用return语句,那么跟在return后面的值,就成了函数的返回值
③ 如果函数使用return语句,但是return后面不跟任何值,那么函数的返回值也是undefined
④ 函数使用return语句后,这个函数会在执行完return语句之后停止并立即退出,return可以切断函数,它后面的代码不会再执行,但代码也会被加载。
 打印函数名,等于打印整个函数;打印执行函数,等于打印返回值。
函数名+(),就是执行函数



4.  函数名、函数体和函数加载问题
① 函数名是什么?
函数名 == 整个函数
② 函数加载问题
JS加载的时候,只加载函数名,不加载函数体。所以如果想使用内部的成员变量,需要调用函数。



5.  变量和作用域(函数中的变量需要函数执行之后才能使用)
(1)全局变量和局部变量
- 任何位置没有var的都是全局变量(成员变量),或者函数之外用var定义的也是全局变量
- 函数内部有var的是局部变量,形参也是局部变量
(2)隐式全局变量
- 函数内部没有var的是全局变量
function  fn(){
    var  a  =  b  =  c  =  1;   // b和c就是隐式全局变量(等号)
    var  a = 1;  b = 2;  c = 3;     // b和c就是隐式全局变量(分号)
    var  a = 1 ,  b = 2 ,  c = 3;    // b和c不是隐式全局变量(逗号)
}

(3)其它
- 函数内部可以访问到该函数所属的外部作用域的变量(作用域链)
- 不使用var声明的变量是全局变量,不推荐使用。
- 变量退出作用域之后会销毁,全局变量关闭网页或浏览器才会销毁



6.  变量声明提升(出现原因:预解析)
就是在页面加载完毕之后,js执行之前,需要先预览一遍整体的js代码,把所有非function内部的变量提升到页面的最顶端。如果在定义变量之前使用了变量,就会出现变量声明提升。
- 使用变量的时候变量的值为undefined,计算后形成NaN
- 变量声明提升在全局和局部都是会出现的
- 对于变量,只提升变量名,不提升变量值
- 对于函数,是整体提升的
(详细解析见后续文章)



7.  匿名函数
定义:没有命名的函数
作用:
    ①不需要定义函数名的时候(一般用在绑定事件的时候)  
    ②书写起来更简便

调用方法:
    ① 直接调用
var fn = function() {}
fn();

    ② 自调用
(function(){alert(1)})();

    ③ 事件绑定
    ④ 定时器




8.  函数是一种数据类型
function



9.  回调函数
- 简单理解:就是 函数做为参数
- 复杂理解:回调函数就是一个通过函数调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。
fn(1,2,demo1);//使用函数名就相当于传递了整个函数

function fn(num1,num2,fun){
    var sum = fun(num1,num2);
    alert(sum);
}

function demo1(n,m){
    return n+m;
}




10.  递归
定义: 函数自己调用自己
使用:必须有跳出条件
(详细解析见后续文章)



11.  闭包
定义: 函数作为返回值
fn()();//第一个小括号是对fn的调用,调用后会返回一个值,后面的括号是对返回值的调用
function fn(){
    return function demo(){
        alert(50);
    }
}
(详细解析见后续文章)



12.  parseInt 和 toString 问题
parseInt把任何进制转换成10进制
十进制值 = parseInt(数值,进制);

toString把10进制转换成任何进制
任何进制值 = 十进制值.toString(进制);



13. 参数传递问题
func(num); //调用函数
所谓的调用函数传参就是将参数中的数据给函数中的参数变量赋值。
调用函数的时候:
-> 将参数拷贝一份
-> 跳转到函数体
-> 进入函数体之前将完成一次赋值,num = 被拷贝的值
不严谨的描述,参数传递就是参数赋值
-> 如果传递的是值类型:值类型会被拷贝,拷贝的是数据,因此在函数内的变量,与函数外的变量是值相同的两个不同变量,值类型在函数内修改的变量以后,函数结束后,数据无影响。
-> 如果传递的是引用类型:引用会被拷贝,拷贝的是地址,而数据还是只有一个,也就是说,函数内与函数外是两个不同的变量,但是指向同一个对象,无论使用函数内,还是函数外的变量对该对象做操作,都是一样的,因此在函数内修改对象的成员,函数结束后,修改结果会保持下来。




小知识
① 函数不调用不执行
② 函数名就等于(整个函数)
③ 加载函数的时候,只加载函数名,不加载函数体
④ 参数相当于局部变量
⑤ 就近原则使用变量
⑥ 两个平级的函数中的变量不会相互影响(可以使用同样的形参名)




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值