首先,在JS的世界中,函数是一等公民,它有着很重要的作用。而什么是函数呢,它起着函数封装,和代码重复的左右(即在代码重复过多,就可以使用函数)
创建函数:
方法一:函数声明及执行方式(推荐)
函数的声明:
function 自定义函数名() {
//一堆代码
具体的功能代码
一堆代码==>函数体
//函数体
}注意:
1. 由于函数是用来实现某种特定功能代码,所以一般我们设置函数名的时候,以动词开始。
2. 函数不能自己执行代码,需要通过函数名调用实现代码的执行函数的调用:
函数名();
例子:
function getSum(num1, num2) {
var sum = num1 + num2;
alert(sum);
}
var a = 2;
var b = 3;
getSum(a, b);
方法二:函数表达式(字面量)及执行方式
var fn = function () {
}
fn();
函数的参数:
形参:
形参时指:在函数创建时,在小扩号中定义的变量。例如在上面代码中num1、num2就代表形参
形参也就是占位符,本身没有真实数据
function 函数名(形参,形参,形参...) {//形参,就是一个占位符,命名规则和规范和变量一样
//函数体
}
注意:
1 函数也可以做为参数进行传递
实参:
实参,在函数调用时,在小扩号中所传入的实际的数据。例如在上面代码中的a、b就代表实参
实参:真实数据
函数名(数据,数据,数据...);
函数:一段代码的封装
定义函数:function 函数名 (形式参数,形式参数......) {函数体}
调用函数:函数名(实际参数,实际参数......);
函数的返回值return
目的:把一个值返回到函数外面
返回值:函数执行完后,可以把执行的结果 通过 return 语法 返回给 调用者
function add(num1,num2){ //num1 和 num2 是两个形参
//函数体
return num1 + num2; // 注意:return 后的代码不执行
}
var resNum = add(21,6); // 调用函数,传入 两个实参,并通过 resNum 接收函数返回值
alert(resNum);// 27
注意:【很重要!!!!!】
1. 如果函数没有显示的使用 return语句 ,那么函数有默认的返回值:undefined
2. 如果函数中写了return语句,后面没有写任何其他内容,那么函数的返回值依然是 undefined
3. 一个函数只能有一个返回值
return num1,num2;//返回结果只有一个,若有多个 则返回最后一个
4. return 代码执行完成后,后面的代码不再执行
5. 函数也可以作为返回值(理解)
函数其他部分
arguments的使用(只有函数可以用)
1. 如果函数参数不确定,可以定义函数的时候不写参数,通过arguments获取
2. 如果函数的参数确定,那么推荐定义函数的时候写参数
其实是个对象,理解为数组
案例:翻转数组
function reverse() {
var arr = [];
for (var i = arguments.length - 1; i >= 0; i--) {
arr[arr.length] = arguments[i];
}
return arr;
}
var a = reverse("red", "blue", "white");
console.log(a);
匿名函数和自调用函数
匿名函数: 没有函数名的函数
例如:
var fn = function () {
}
总结:
1. 匿名函数不能单独使用
2. 可以将匿名函数赋值给一个变量
3. 可以让匿名函数自己调用自己
自调用函数: 函数封装好,立即执行。
总结:
1. 自调用函数可以是命名函数也可以是匿名函数
2. ( function () {} )();
函数作用域及局部变量
作用域
作用域: 变量或者函数可以起作用的区域
◆ 全局作用域(全局变量)
1, 在script标签中或者js文件中定义的变量,在任何地方都可以访问
2, 在函数内部声明变量不使用var关键字 (不建议使用)
◆ 局部作用域(局部变量)
1, 在函数内部定义的变量
2, 局部变量只能在定义变量的函数中使用
◆ 块级作用域 (目前所学版本没有,新版本语义中有块级作用域)
{
块级作用域
}
1. 本质上块级作用域中的变量在外部不能访问
2. 但是在js中可以访问块级作用域的变量(证明js没有块级作用域)
全局作用域(全局变量)
声明在所有函数外部的变量,可以所有地方使用
案例:
var age = 18;
console.log(age); //18
function fn(){
console.log(age)//18
}
fn();
局部作用域(局部变量)
声明在某个函数内部的变量或函数的形参,只能在函数内部使用
案例:
function fn(){
a = 100; //全局变量
var b = 200;
}
fn();
console.log(a); //100
console.log(b); // not defind
作用域链
当访问一个变量时,会先从本作用域中去找这个变量,若找不到则向上一级作用域中去找,依次类推,就形成了一个作用域链。
案例:
var a = 1;
function fn1(){
var a = 2;
function fn2(){
console.log(a); //a的值2
}
fn2()
}
fn1();
预解析:
1. js 代码执行先执行预解析
2. 先进行变量提升: 把变量声明提升到当前作用域的最上面,不包括变量的赋值
3. 函数提升: 把函数声明提升到当前作用域的最上面,不包括函数的调用
【预解析:变量和函数】
【带有var的变量,把这个变量的定义语法,提到当前作用域最前面(注意:只定义不赋值)】
【带有名字的函数,把这个函数的定义语法,提升到当前作用域最前面(注意:只定义不调用)】
案例:
变量预解析:
var a = 25;
function abc () {
alert(a);
var a = 10;
}
abc();
// undefined
相当于:
var a;
a =25;
function abc () {
var a;
alert(a);
a = 10;
}
abc();
注意:如果函数名和变量名一样,函数优先
案例:
console.log(a) // a() = function
function a () {
console.log(a);
}
var a = 1;
console.log(a); //1;
输出:ƒ a() {
console.log(a);
}
1
函数预解析:
var num = 10;
fun ();
function fun () {
console.log( num );
var num = 20;
}
//undefind
相当于:
var num ;
num= 10;
fun ();
function fun () {
var num;
console.log( num );
num = 20;
}