目录
函数没有return返回undefined
函数如果有return则返回的是return,如果没有 则返回undefined
return退出循环,且能够返回return语句中的值
代码
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>没有return返回undefined</title> <script> //4.函数如果有return则返回的是return,如果没有 则返回undefined function fun1() { return 666; } console.log(fun1()); function fun2() { } console.log(fun2()); </script> </head> <body> </body> </html>
结果
arguments的使用
只有函数才有arguments对象 而且每个函数都内置好了arguments
当不确定有多少个参数传递,使用arguments获取参数
arguments是当前函数的内置对象
arguments存储了传递的所有实参
伪数组
1.不是真正意义上的数组
2.具有数组的length的属性
3.按照索引的方式进行存储
4.但是它没有真正数组的一些方法:pop() push()
代码
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>arguments的使用</title> <script> //伪数组 并不是真正意义上的数组 function fn() { /* console.log(arguments);//里面存储了所有传递过来的实参 console.log(arguments.length);//伪数组具有数组的length属性 console.log(arguments[2]);//伪数组也用索引方式存储 */ //我们可以使用数组的方式遍历arguments for (var i = 0; i < arguments.length; i++) { console.log(arguments[i]); } } fn(1, 2, 3); fn(1, 2, 3, 4, 5); </script> </head> <body> </body> </html>
结果
利用arguments求任意个数的最大值
案例
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>利用arguments求任意数的最大值</title> <script> function getMax() { var max = arguments[0]; for (var i = 0; i < arguments.length; i++) { if (arguments[i] > max) { max = arguments[i]; } } return max; } console.log(getMax(1, 2, 3)); console.log(getMax(1, 2, 3, 4, 5)); console.log(getMax(11, 2, 34, 444, 5, 100)); </script> </head> <body> </body> </html>
结果
利用函数翻转数组
案例
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>利用函数翻转数组</title> <script> //reverse 翻转的意思 function reverse(arr) { var newArr = []; for (var i = arr.length - 1; i >= 0; i--) { newArr[newArr.length] = arr[i]; } return newArr; } var arr1 = reverse([1, 3, 4, 6, 9]); console.log(arr1); </script> </head> <body> </body> </html>
结果
利用函数封装进行冒泡排序
案例
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>利用函数封装进行冒泡排序</title> <script> //sort排序的意思 function sort(arr) { var temp; for (var i = 0; i < arr.length - 1; i++) { for (var j = 0; j < arr.length - i - 1; j++) { if (arr[j] > arr[j + 1]) { temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } return arr; } var re = sort([1, 9, 3, 15, 5]); console.log(re); var re2 = sort([9, 66, 45, 43]); console.log(re2); </script> </head> <body> </body> </html>
结果
利用函数封装判断是否是闰年
案例
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>利用函数封装判断是否是闰年</title> <script> //如果是闰年返回true 否则返回false function isRunYear(year) { var flag; if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) { flag = true; } else { flag = false; } return flag; } var re = isRunYear(2012); console.log(re); </script> </head> <body> </body> </html>
结果
函数可以调用另外一个函数
每个函数都是一个代码块,用于完成特殊任务,所以经常函数之间相互调用
案例
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>函数之间的相互调用</title> <script> //1.案例一 /* function fn1() { console.log(11); fn2();//在fn1里面调用了fn2函数 } fn1(); function fn2() { console.log(22); } */ //2.案例二 fn1与fn2之间的相互调用 function fn1() { console.log(111); fn2(); console.log('fn1'); } function fn2() { console.log(222); console.log('fn2'); } fn1(); </script> </head> <body> </body> </html>
结果
输出2月份天数
案例
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>输出年份的2月份天数</title> <script> function backDay() { var year = prompt('请你输入年份'); if (isRunYear(year)) {//实参year alert('当前年份是闰年2月份有29天'); } else { alert('当前年份是平年2月份有28天'); } } backDay(); //2.判断是否是闰年的函数 function isRunYear(year) {//形参year var flag; if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) { flag = true; } else { flag = false; } return flag; } </script> </head> <body> </body> </html>
结果
函数的两种声明方式
1.利用函数function关键字来自定义函数(命名函数)
2.函数表达式(匿名函数)
格式:var 变量名 = function(){};
没有函数名
函数表达式声明方式和变量差不多
函数表达式也可以进行传递参数
代码
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>函数的两种生命方式</title> <script> //2.函数表达式 (匿名函数) //var 变量名 = function (aru) { }; var fun = function (aru) {//fun是变量名不是函数名 console.log(aru); } fun('多云'); </script> </head> <body> </body> </html>
结果
作用域
JavaScript作用域
就是代码名字在某个范围内起作用效果
提高程序的可靠性,减少命名冲突
全局作用域
整个script标签或者一个单独的JS文件
局部作用域
在函数内部就是局部作用域 只在函数内部起效果和作用
代码
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script> //全局作用域 var num = 10; //局部作用域 function fn() { var num = 20; console.log(num); } fn(); </script> </head> <body> </body> </html>
结果
变量作用域
全局变量
在全局作用域下的变量
在代码任何位置都可以使用
注意:在函数内部没有声明直接使用的变量也属于全局变量
局部变量
在局部作用域下
在函数内部var声明的变量是局部变量
函数的形参也是局部变量
区别
执行效率:全局变量只有浏览器关闭的时候才会销毁,比较占用资源;局部变量当程序执行完毕就会销毁,比较节约内存资源。
代码
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>变量作用域</title> <script> //1.全局变量 var num = 10;//num全局变量 console.log(num); function fn() { console.log(num); } fn(); //2.局部变量 函数内部变量 function fun(aru) { var num1 = 10;//num1是局部变量 只能在函数内使用 num2 = 20;//num2没有声明直接使用 也属于全局变量 } fun(); console.log(num1);//不能被调用 console.log(num2);//注意 如果在函数内部没有声明,直接使用的变量也是全局变量 </script> </head> <body> </body> </html>
结果
JS没有块级作用域
但是在es6新增了块级作用域
块级作用域使用{}进行包含
代码
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>JS没有块级作用域</title> <script> if (3 > 5) { var num = 10; } console.log(num);//在块级作用域里面声明的变量 外面也可以使用 所以可以输出 </script> </head> <body> </body> </html>
结果
作用域链
只要是代码就有一个作用域
如果函数中还有函数,那么在这个作用域中又诞生了新的作用域
定义:内部函数访问外部函数的变量,采取链式方法查找决定哪些数据能被内部函数访问(就近原则)
代码
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>作用域链</title> <script> var num = 10; function fn() {//外部函数 var num = 20; function fun() {//内部函数 console.log(num);//输出结果为20 } fun(); } fn(); </script> </head> <body> </body> </html>
结果
案例1
案例
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>作用域链案例</title> <script> //案例1 function f1() {//0级链 var num = 123;//1级链 function f2() {//1级链 console.log(num);//2级链 输出1级链结果 123 } f2();//1级链 } var num = 456;//0级链 f1();//0级链 //案例2 var a = 1; function fn1() { var a = 2; var b = '22'; fn2(); function fn2() { var a = 3; fn3(); function fn3() { var a = 4; console.log(a);//输出结果为4 console.log(b);//输出结果为'2' } } } fn1(); </script> </head> <body> </body> </html>
结果
JS预解析
JavaScript代码是由浏览器的JavaScript解析器来执行的
解析器在运行JavaScript代码分为两步:预解析、代码执行
预解析
JS引擎会把js里面所有的var 还有function提升到当前作用域的最前面
变量预解析
把所有的变量声明提升到当前作用域的最前面
只提升声明,不提升赋值操作
函数预解析
把所有的函数声明提升到当前作用域的最前面,但是不调用函数。
代码
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>预解析</title> <script> //1. //console.log(num); 输出结果报错 //2. /* console.log(num); 输出结果为undefined var num = 10; */ //2.相当于执行了以下代码 /* var num; console.log(num); num = 10; */ //3. /* fn(); function fn() { console.log(11); 输出结果为11,正常输出 } */ //3.相当于 /* function fn(){ console.log(11); } fn(); */ //4. /* fun(); var fun = function () { console.log(22); 输出结果报错, } */ //4.相当于以下代码 /* var fun; fun(); fun =function(){ console.log(22); } */ //5.预解析 </script> </head> <body> </body> </html>
代码执行:执行代码书写顺序从上往下执行
预解析案例1
案例
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>预解析案例/title> <script> //案例1 var num = 10; fun(); function fun() { console.log(num);//输出结果为undefined var num = 20; } //相当执行了一下操作 /* var num; function fun() { var num; console.log(num); 只有输出结果没有赋值 num = 20; } num = 10; fun(); */ //案例2 var num = 10; function fn() { console.log(num);//输出结果为undefined var num = 20; console.log(num);//输出结果为20 } fn(); //相当于一下代码 /* var num; function fn() { var num; console.log(num);//输出结果为undefined num = 20; console.log(num);//输出结果为20 } num = 10; fn(); */ </script> </head> <body> </body> </html>
JavaScript对象(object)
对象是一个具体事物
JavaScript对象是一组无序的相关属性和方法的集合,所有事物都是对象,例如字符串、数值、数组、函数
对象是由属性和方法来组成的
属性
事物的特征,在对象中用属性表示(常用名词)
方法
事物的行为,在对象中用方法来表示(常用动词)
创建对象的三种方法
利用字面量
对象字面量:花括号包含了表达这个具体事物的属性和方法
注意事项
里面的属性和方法采取键值对 键 属性名: 属性值
多个属性或者方法使用逗号隔开,最后一个不需要
方法冒号后面是一个匿名函数
使用对象:
调用对象属性
1. 对象名.属性名 如 obj.uname;
2.对象名['属性名'] 如obj['age'];
调用对象的方法
对象名.方法名();
代码
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script> var obj = { uname: '张三',//采取键值对形式 属性名:属性值 age: 18,//不同属性或者方法采用逗号隔开 sex: '男', sayHi: function () {//function方法 console.log('Hi~'); } } console.log(obj.uname);//调用uname对象名 对象名.属性名 console.log(obj.age);//调用age对象名 obj.sayHi();//调用函数 对象.方法名() </script> </head> <body> </body> </html>
结果
变量、属性、函数、方法区别
变量和属性都是用来保存数据的
变量单独声明并赋值 ,使用的时候直接写变量名
属性在对象里面,不需要声明, 使用的时候是 对象.属性
函数时单独声明,并且调用的, 而方法在对象里面,调用的时候 对象.方法()
代码
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script> var num = 10; var obj = { age: 18, fn: function () {//这是方法 在对象里面 } } function fn() {//这是函数 } console.log(obj.age); </script> </head> <body> </body> </html>
结果
利用new Object
语法:var 对象 = new Object
对象名.属性 = 属性值;
利用等号赋值的方法,添加对象属性和方法
每个属性和方法之间用分号结束
代码
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script> var obj = new Object(); obj.uname = '张三'; obj.age = 18; obj.sex = '男'; obj.sayHi = function () { console.log('Hi~'); } </script> </head> <body> </body> </html>
利用构造函数
可以创建多个对象,
把一些相同的属性和方法抽象出来封装到函数里面
构造函数是用来封装对象的