函数
1.js函数的概念
函数就是把特定功能的代码抽取出来,使之成为程序中的一个独立实体。
2.函数的作用
正如函数的概念,我们可以根据需要,将特定的功能函数来包裹(封装)
3.使用函数的好处
1.函数可以在同一个程序或其他程序中多次重 复使用(通过函数名调用)
2.使程序变得更加简短清晰,提高可读性。
3,有利于系统维护。
函数讲解
函数是什么?
函数其实就抽取写好的js代码作为一个通用的代码块(封装)
作用:
减少代码冗余(过多)方便调用(提供效率提高代码的可读性)便于维护(二次修改)//js有哪些函数
1.系统函数2.内置函数3.自定义函数
函数带括号就是函数
系统函数就是系统自带的函数alert()
内置函数 Math.pow() 属于Math对象的内置函数
自定义函数 你自己写的函数,需要先书写,再进行调用
函数主要依赖于function关键字进行定义 一般的函数名以fn开头
自定义函数的三种声明方式
1.第一种声明
function 函数名(参数1,参数2...){
函数体(需要进行的操作)
}调用
函数名()就能进行调用
2.第二种声明
var 变量名 = function(){
函数体
}
var fn = function(){
console.log('hello world')
}调用 使用变量名()
fn()
3.第三种声明 使用new方式
var fnObj = new Function("console.log('hello function object')")
调用 fnObj()
在初始状态页面加载的时候,js会优先加载function以及对应的变量命名,但是他不会加载变量赋值的过程。
return关键字
return是用于函数里面返回数据的,没有数据返回的话,默认返回undefined。
function fu(){
console.log( 'hello');
}
//fn调用了没有 函数名() 他就会调用
var a = fn();//调用了一遍 a是相当于fn的返回值 而不是fn这个函数
console.log(a);//undefined
形参:
形参就是在函数定义时,函数名后面的参数; 函数的形参跟变量是一样使用,且不能用var修饰
实参:
实参就是调用时,函数名后面的参数
函数的参数可以写可以不写具体要看对应的参数有没有被使用到
在函数定义的时候里面的参数名可以随便写因为他是一个形参
function add(number1){
console.log( " hello world ');
} //因为上述的形参没有被便用到那么我们可以省略这个参数传递
俩个数相加的方法
在调用的时候进行参数传递传递的参数必须要为实参(实际值的参数 常量)
function addToTwoNumber(number1, number2){
return number1+number2
}
var number03 = addToTwoNumber(1,2)
console.log(number03);
var a = 10
var result =addToTwoNumber(a, 10)
console.log(result);
实操练习代码:
将符号作为参数进行传递
function computerNumber(number1, number2,sym){
switch(sym){
case '+':
console.log("加执行了');
return number1+number2
case '-':
console.log(减执行了');
return number1-number2
case '*':
console.log('乘执行了');
return number1*number2
case '/':
console.log('除执行了');
return number1/number2
case '%':
console.log('取余执行了");
return number1%number2
default:
console.log("参数错误");
}
}
arguments 关键字 (参数数组)
JS中函数不介意传递进来多少个参数,也不在乎传进来参数是什么数据类型,在调用函数时也未必一定要传递指
定数量的参数,原因是 ECMAScript 中的参数在内部是用一个数组(arguments)来表示的。函数接收到的始终都是
这个数组,而不关心数组中包含哪些参数(如果有参数的话)。
arg参数 arguments表示的是参数数组 他具备数组的特性 他可以接收用户传递所有参数 arguments他可以接收
任意类型的值
length属性获取对应的长度 具备下标 获取指定的元素(从0开始)
function fn()
console.log(arguments.length);
fn(1,2,3)
fn( '1 ' ,null,undefined) //arguments他可以接收任意类型的值
求和任何参数的和
function sum(){
//接收的所有数据都存在于arguments数组里面获取所有的数据进行求和
//遍历对应的arguments数组
var result = 0 //接收所有的和
for(var i=0;i<arguments.length;i++){
//arguments[0]取出第一个值
result+= arguments[i]
}
return result
}
//调用多个参数使用,隔开
console.log( sum( 3,4,3,4,4,6));
在传值调用的机制中只能把实参传送给形参,而不能把形参的值反向地传送给实参。因此在函数调用过程中,当
形参值发生改变,而实参中的值不会变化。
function addNum(n){
n += 5; //将形参+5, 不会改变实参
}
var a=10;
addNum(a);
console.log(a); //10
变量作用域
作用域:
就是起作用的范围。或者说有效范围; 这里涉及到另外两个概念
局部变量:
定义在函数内部的变量,这个变量只能在函数内部使用,即作用域范围只是函数内部,另外,形参也是局部变量.
全局变量:
全局变量就是定义在函数外部的变量,这个变量在任何函数中都有效,即作用域范围是当前文件的任何地方.
变量作用域 变量分为全局变量 作用域为全局和局部变量为对应的代码块内 (function)
全局作用域可以在局部调用 局部作用不能应用在全局
全局作用域的东西他对应的可以在局部更改 局部作用域不能全局更改
局部作用域的代码块不包含 if switch 以及 for (声明的变量还是全局变量)
在function里面声明的变量 他的作用域只存在与function 对应的全局声明的变量可以存在于全局
var a = 10//全局艾量
for(var i=0;i<10;i++){ //i++ 执行的次数比里面的多一次
var a = 5//局部变量
console. log(a);//5
}
console. log(a);//10
function fn2(){
var d = 20
console.log(d);//20
}
var d = 30
fn2()
console.log(d); //30
作用域链
函数的嵌套:
函数的嵌套: 函数内部可以再包含其他函数;
函数之间允许相互调用,也允许向外调用, 但是不可以调用同级函数的嵌套函数;
关于函数的嵌套如果你调用了最外层的function那么是不会自动调用内层的function
var first = 50//全局变量
//关于函数的嵌套 如果你调用了最外层的function 那么是不会自动调用内层的function
function fn1(){
var a = 10//局部变量
function fn2(){
var b = 20//局部变量
function fn3(){
var c = 30//局部变量
function fn4(i
var d = 40//局部变量
//f未定义的找不到这个f 报错
//如果找不到对应的变量就会出现报错
console.log(a+b+c+d+first+f);//a是fn1 b是fn2 c是fn3 d自身的 first全局变量
//当你的里面不包含这个变量他会向对应上层去寻找这个变量
//这个逐层向上寻找变量的过程叫做作用域链
//什么叫作用域就是一个变量的作用的区域
}
fn4()
}
fn3() //调用第三层的function
}
fn2()//调用第二层的function
}
//调用最外层的function
fn1() // 10+20+30+40+50-= 150