1.函数
1.函数的概念
在js里面,可能会定义非常多的相同代码或者功能相似的代码,这些代码可能需要大量重复使用,而用for循环具有局限性,因此我们就可以使用JS中的函数
函数:就是封装了一段可被重复调用执行的代码块,通过此代码块可以实现大量代码的重复使用(函数的目的)
2.函数的使用
函数的使用分为两步:声明函数和调用函数
声明函数 function 函数名(){
函数体;
}
- 函数是做某些事情,函数名一般是动词
- 函数不调用,自己不执行
3.函数的封装
- 函数的封装是把一个或者多个功能通过函数的方式封装起来,对外只提供一个简单的函数接口
简单理解:封装类似于将电脑配件整合到机箱中(类似于快递打包)
4.函数参数和返回值return
1.函数形参和实参个数不匹配问题
| 参数个数 | 说明 | | —- | —- | | 实参个数等于形参个数 | 输出正确结果 | | 实参个数多于形参个数 | 只取到形参的个数 | | 实参个数小于形参个数 | 多的形参定义为undefined,结果为NaN |
声明函数时,函数名括号里面的是形参,形参的默认值是undefined
-
2.函数的返回值return
return终止函数,后面的代码不会执行
- return只能返回一个值,返回的结果是最后一个值
- 如果函数没有return,就返回undefined
-
5.arguments使用
当我们不确定有多少个参数传递的时候,可以用arguments来获取。在JavaScript中,arguments实际上它是当前函数的一个内置对象。所以函数都内置了一个arguments对象,arguments对象中存储了传递的所有实参。
arguments展示形式是一个伪数组,因此可以进行遍历,伪数组具有以下特点: 具有length属性
- 按索引方式储存数据
- 不具有数组的push,pop等方法
只有函数才有arguments对象,而且是每个函数都内置好了这个arguments
function fn(){
console.log(arguments);//存储了传递的所有实参
console.log(arguments.length);
}
fn(1,2,369);
输出结果:
Arguments(3) [1, 2, 369, callee: ƒ, Symbol(Symbol.iterator): ƒ]
0: 1
1: 2
2: 369
length: 3
callee: ƒ fn()
Symbol(Symbol.iterator): ƒ values()
__proto__: Object
3
案例:利用函数求任意个数的最大值
function getmax(){
var num=arguments[0];
for(var i=0;i<arguments.length;i++){
if(arguments[i]>num){
num=arguments[i];
}
}
return num;
}
console.log(getmax(1,7,6));
输出结果:
7
6.函数的声明方法
1.利用函数关键字自定义函数(命名函数)
function fn(){}<br /> fn();<br />2.函数表达式<br /> var 变量名=function(){};<br /> var fun=function () {<br /> document.write("函数表达式")<br /> };<br /> fun();<br />fun是变量名,不是函数名,这个函数没有名字,所以叫做匿名函数
2.作用域
1.作用域概述
通常来说,一段程序代码中所用到的名字并不总是有效和可用的,而限定这个名字的可用性的代码范围就是这个名字的作用域
作用域的使用提高了程序逻辑的局部性,增强了程序的可靠性,减少了名字冲突
JavaScript作用域:就是代码名字在某个范围内起作用和效果2.全局变量和局部变量
全局变量:在全局作用域下的变量,在全局下都可以使用
注意:如果在函数内部,没有声明直接赋值的变量也属于全局变量
局部变量:在局部作用域下的变量。后者在函数内部的变量就是局部变量
注意:函数的形参也可以看做是局部变量
- 从执行效率来看(区别):
全局变量只有浏览器关闭的时候才会销毁,比较占内存资源
局部变量当我们程序执行完毕,就会销毁,比较节约内存资源
现阶段JavaScript没有块级作用域,js也是在es6时新增的块级作用域
即()、{}等,在里面定义的变量可以拿到外边去使用
如:if(3<5){
var num=6;
}
document.write(num);
输出结果为:6
3.作用域链
作用域链:内部函数访问外部韩式的变量,采取的是链式查找的方式来决定那个值(就近原则)
4.预解析
JavaScript代码是由浏览器中的JavaScript解析器来执行的,JavaScript解析器在运行JavaScript代码的时候分为两步:预解析和代码执行
js引擎运行js分为两步:预解析 代码执行
- 预解析:js引擎会把js里面所有的var 还有function提升到当前作用域的最前面
- 代码执行:按照代码书写的顺序从上往下执行
预解析分为变量预解析(变量提升)和函数预解析(函数提升)
变量提升:就是把所有的变量声明提升到当前作用域最前面,不提升赋值操作
函数提升:就是把所有的函数声明提升到当前作用域的最前面 不调用函数
//1问
//console.log(num);
//2问,相当于先执行了 var num;
console.log(num);
var num=10;
//3问
//fn();
function fn(){
console.log(11);
}
//fn();
//4问
//fun();报错,相当于执行了 var fun; fun();变量没有赋值,所以不能被调用
var fun1=function(){
console.log(22);
}
fun1();//相当于先执行了var fun;
var num=10;
fun();
function fun(){
console.log(num);
var num=20;
}
//相当于
var num;
function fun(){
var num;
console.log(num);
num=20;
}
num=10;
fun();
f1();
console.log(c);
console.log(b);
console.log(a);
function f1(){
var a = b = c =9;
console.log(a);
console.log(b);
console.log(c);
}
//相当于
function f1(){
var a;//a有var声明,局部变量,b和c直接赋值,没有var声明,当全局变量看
a = b = c =9;
console.log(a);
console.log(b);
console.log(c);
}
f1();
console.log(c);
console.log(b);
console.log(a);
输出结果:
undefined
预解析.html:34 22
2预解析.html:48 undefined
预解析.html:68 9
预解析.html:69 9
预解析.html:70 9
预解析.html:55 9
预解析.html:56 9
预解析.html:57 Uncaught ReferenceError: a is not defined
at 预解析.html:57
2021.9.13.17:25