day4 函数
一、函数
函数是什么? 函数就是抽取写好的js代码,作为通用的代码块
作用: 减少代码冗余(过多) 方便调用(提高效率 提高可读性) 便于维护(二次修改)
js有哪些函数
// 1.系统函数 就是系统自带的函数 alert() 只需要调用
// 2.内置函数 Math.pow() 属于Math对象的内置函数 只需要调用
// 3.自定义函数 自己写的函数 先书写后调用
// 函数主要依赖于function关键词进行定义 一般多函数名以fn开头
自定义函数的三种声明方式
// 第一种声明
// function 函数名(参数一,参数二,参数三....){
// 函数体(需要进行的操作)
// }
function show(){
console.log("hello function");//函数体
}
//调用 函数名+()
show()
// 第二种声明
// var 变量名=function(){
// 函数体
// }
var fn=function(){//fn就是个变量名 表示当前fn是个函数 fn就是表示这个函数
console.log("你好");
}
//调用 变量名+()
fn()
// 第三种声明 使用new的方式 不常用 凡是使用new的都是对象
var fn1=new Function("console.log('helll 你好')")
//调用
fn1()
第一种和第二种的区别
在初始状态页面加载的时候 js会优先加载function以及对应的变量 但是他不会加载变量赋值的过程
使用function直接写一个函数
function fn1(){//调用可以放在前面
console.log("我是函数1");
}
使用变量接收一个函数
var fn2=function(){//调用写在前面就是undefined
console.log("我是函数2");
}
关于fn2调用在变量赋值之前 所以fn2是undefined的值
return关键词 是用于函数里面返回数据的,没有数据返回的话默认返回undefined
function fn(){
console.log("你好");
}
fn调用了没有 只要有函数名() 他就会调用
var a=fn()//调用了一边 a相等于fn返回值 而不是这个函数
console.log(a);//undefined
函数参数可以写,可以不写,具体要看对应的参数有没有被使用到
在函数定义的时候,里面的参数名可以随便写, 因为他是一个形参
function add(){
console.log("你是猪");
}
因为上面的形参没有被使用到,那我们可以省略这个参数传递
add()
两个数相加的方法
function addnum(num1,num2){
return num1+num2
}
在调用的时候进行参数传递,传递的参数必须要为实参(实际值的参数 常量)
var num3=addnum(1,2)
console.log(num3);
实参的数量要对应形参
将参数进行传递
function computer(num01,num02,sym){
switch(sym){
case '+':
return num01+num02
break;
case '-':
return num01-num02
break;
case '*':
return num01*num02
break;
case '/':
return num01/num02
break;
case '%':
return num01%num02
break;
default:
console.log("出错了");
}
}
console.log(computer(3,5,'+'));
当方法执行到return的时候 ,return会结束整个方法 只会结束function不会结束 for switch
function fn(){
arg 参数 arguments 表示的是参数数组,他具备数组的特性 他可以接收用户传递的所有参数
length属性 获取对应的长度,具备下标获取指定的元素(从0开始)
console.log(arguments);
}
arguments他可以接收任意类型的值
fn(1,2,3)
function sum(){
var res=0
for(var i=0;i<arguments.length;i++){
res+=arguments[i]
}
return res
}
console.log(sum(1,2,3,4,5,6));
多个参数使用逗号隔开
二、变量作用域
变量分为全局变量和局部变量,局部变量为对应的代码块内(function) 不包含 if switch 以及for
var a=10//全局变量
for(var i=0;i<10;i++){
var a=5//全局变量
console.log(a);//5
}
console.log(a);//5 全局变量
console.log(i);//10 全局变量
var b=10//全局变量
function fn(){
var b=20//重新声明全局变量b
console.log(b);//局部变量20
}
fn()
console.log(b);//全局变量 10
在function里面声明的变量,他的作用域只存在function 对应的全局声明变量是可以存在于全局的
var c=30//全局变量
function fn1(){
c=20//没写var 就是引用全局变量c
console.log(c);//局部变量20
}
fn1()
console.log(c);//全局变量 20
全局作用域可以在局部调用,局部不能应用在全局
全局作用域的东西他对应的可以在局部中更改,局部作用域不能在全局中更改
局部作用域的代码块不包含if switch 以及for
三、作用域链 函数的嵌套
作用域链
函数的嵌套
关于函数的嵌套 如果你调用了最外层的function 那么是不会自动调用内层的 function
var first=50
function fn1(){
var a=10//局部变量
function fn2(){
var b=20//局部变量
function fn3(){
var c=30//局部变量
function fn4(){
var d=40//局部变量
//f未定义 找不到f 报错
//如果找不到对应的变量就会报错
//var f 不赋值 但是找的到 就是undefined
// +f
console.log(a+b+c+d+first);
//a是fn1的 b是fn2的 c是fn3的 d是fn4的first全局变量
//这个逐层向上寻找变量的过程叫做作用域链
//什么叫作用域 就是一个变量作用的区域
}
fn4()
}
fn3()
}
fn2()
}
fn1()

浙公网安备 33010602011771号