函数
如果有一段代码要反复执行
那么我们可以用大括号 包起来 起个名字 用来反复调用
这就是函数
所谓函数就是一段代码可以反复执行 只要调用函数 就可以反复执行重复的代码
函数定义的格式:
function 函数名(参数(形参)){
函数体代码(要被反复执行的代码)
}
调用函数
函数名(实参);
function show(){
console.log("请不要秀");
}
show();
因为函数运行过程中可能需要外部(函数调用者)传进来指定的数据
所以函数需要参数
格式:
//形式参数
function 函数名(参数1,参数2,参数3,...参数n){
}
函数调用: 传入实际参数
要和形式参数 格式一样
函数名(实参1,实参2,实参3,...实参n)
function plus(a){ //形参
console.log(a+10);
}
plus(55) //实参
plus(108)
形参和实参的数量不一致时的处理:
形参大于实参时(需要三个参数 我却传了2个 少传了):
多于的形参 值为undefined
形参小于实参(需要三个参数 我却传了4个 多传了):
多于的实参不予理会
形参和实参数量相等:
正常使用
function show(a,b,c) {
console.log(a,b,c);
}
// show(5,6)
show(5,6,7,8)
在js中没有函数重载 所以 函数不要重名
一旦重名 则后来的覆盖之前的
function show() {
console.log("我是第一个show函数");
}
function show(a) {
console.log("我是第二个show函数(带一个参数)");
}
show();
有些时候 函数运行需要 返回给外部一个结果
例如:
计算的函数,计算完 把结果返回给外部使用
这样比直接在函数内部把结果打印要好
因为实际开发中 打印语句只是用来调试程序的
总不能让用户去看控制台吧
如何返回一个结果给给外部:
在函数的最后一行 通过 return 结果; 返回一个结果给外部使用
调用者接收返回值
var 变量=函数名(参数); 调用函数并接收到返回值 存入变量中
return 都可以返回哪些类型呢?
所有类型都可以返回
/* function plus(a,b) {
return a+b;
}
var result=plus(55,66);
console.log(result);
console.log(result*10);*/
/* function jian(a,b) {
return a-b;
}
console.log(jian(10,8));*/
函数的返回值几个注意点:
1.函数里面如果没有return 那么函数默认返回undefined
2.return 执行了 那么return后面的值 就是返回值
3.有return语句 但是return后面没有跟任何结果
那么返回值也是undefined
意义:单纯的为了停止函数(return 表示一个函数结束)
4.return 后面不能写任何代码 写了 也无法执行
break和continue一样的效果
5.实际开发中 函数的返回值要保持一致的 类型一致 不要随意切换类型
或者干脆别反悔 否则 会导致程序混乱
函数创建有两种方式:
1.函数模式
function 函数名(){}
2.变量模式创建
var 函数名=function(){}
function(){} --->匿名函数
function show() {
}
var demo=function(a,b){
console.log("我是demo函数");
return a+b;
};
var result=demo(9,15);
console.log(result);
函数名,函数体和函数加载
直接打印函数名,把函数代码整个以字符串打印出来
函数名就代表整个函数
执行函数,就是等于执行函数的代码并且返回一个返回值
函数名() 就是调用函数,执行函数里面的代码 并得到一个返回值
调用函数中如果包含函数,那么会先执行里面,再执行外面
先执行内部函数 取得返回值 然后再拿着返回值 执行外部函数
也就是内部函数的返回值 就是外部函数的参数
/*function show() {
console.log("我是一个show函数");
}
console.log(show);
console.log(show());//调用函数并取得返回值 返回undefined*/
作为作用域:
作用的域 作用:生效的意思 域:范围
变量的作用域 就是变量的生效范围
在js中作用域分为两种:
全局作用域:
在函数外(不在任何一个函数内) script标签内声明的变量
就是全局变量 全局作用域下的变量
在变量创建后的任意位置都可以使用
局部作用域
在函数内声明的变量就是局部变量 只能在当前函数内使用
函数外再也无法使用
生命周期:
全局变量:
页面加载时 全局变量被创建
页面关闭时 销毁
生命周期比较长 容易空占内存
局部变量:
方法调用时创建 方法调用完毕销毁
生命周期比较短 推荐使用
/*var a=10;
/!*console.log(a);
function show() {
console.log(a);
}
show();*!/
function demo() {
var num=99;
console.log(num);
}
demo();
console.log(num);//num is not defined 报错*/
隐式全局变量:
不适用var创建的变量
不推荐使用(就是不要使用!!!!!!!!!!!!)
demo();//函数提升到当前作用域第一行 所以当前作用域任意位置都可以调用
/*
在js代码开始一行一行往下运行之前
存在一个预解析阶段
相当于大概看一眼 下面的代码 都声明了 哪些变量和函数
也就是 在预解析阶段 js程序会首先把 用var 声明的变量
和用function创建的函数 进行一个提升
变量提升:
在预解析阶段 用var声明的变量可以被提升到当前作用域!!!的第一行
全局变量被提升到全局第一行
局部变量 被提升到局部第一行
变量只提升变量名 不提升变量值
函数提升
在预解析阶段 用function创建的函数会被整个提升到当前作用域第一行
函数提升 是提升整个函数
在当前作用域任意位置都可以调用
/*
//全局变量提升
console.log(a);//undefined
var a=10;
//模拟提升后的代码 var a;
console.log(a);
a=10;*/
// 局部变量的提升
/*function show() {
console.log(num);
var num=10;
}
show();
//提升后的代码
function show() {
var num; //局部变量提升到局部第一行
console.log(num);
num=10;
}*/
小知识点
函数不调用就不执行
函数名就等于整个函数
加载函数的时候,只加载函数名,不加载函数体
函数不论是提升还是加载 只加载函数名 不执行不加载函数里面的代码
参数相当于局部变量
函数的参数 只能在当前函数中使用 就是一个局部变量
就近原则使用变量
如果函数内部调用变量时 函数内部有这个变量了 那么就不去外部找
两个平级的函数中的变量不会互相影响(可以使用相同的形参名)
两个函数之间 内部的局部变量 完全不影响
函数的高级
<script>
//匿名函数----了解
/* var show=function(){} //匿名函数用作函数创建
function qq() {
return function(){}; //匿名函数可以作为返回值(js高级的闭包去讲)
}
function ww(fn) {
}
ww(function(){}); //匿名函数作为参数->回调函数(一会讲)
//后面讲定时器
setTimeout(function () {
//页面加载完毕 5秒后 执行这里面的代码
},5000)*/
//函数也是一种数据类型---->了解
/* function show() {
}
console.log(typeof show);//function*/
//递归函数--->了解
//所谓递归函数 就是函数自己调用自己
/*function show() {
console.log("我是递归函数");
show();
}
show();*/
/*
递归函数 最重要的是 结束条件
*/
var i=0;
function show() {
i++;
console.log("我是递归函数");
if(i<10){//结束条件
show();
}
}
show();
</script>
函数的高级之回调函数
<script>
/*
所谓回调函数:
就是回来调用的函数 就是函数作为参数传入其他函数 让其他函数来调用
*/
/*function show(fn) {
console.log("我是show方法");
// 调用参数的函数
fn();
}
/!*show(function(){
console.log("我是回调,居然被调用了");
})*!/
show(function () {
})*/
//回调函数
function show(fn) {
console.log("我是show方法");
fn(9,8);//函数调用
}
show(function (a,b) {
console.log("我是回调函数",a,b);
})
</script>