目录
1)先输出变量,再初始化变量(声明并赋值),为什么输出的变量显示未定义?
2)使用函数关键字声明函数时,把调用写在声明之前,为什么不会报错?
3)使用函数表达式声明函数时,把调用写在声明之前,为什么会报错?
作业6:使用arguments完成函数getResult,实现得到输入的所有的数值中的最小值、最大值、平均数、总和等功能
一、arguments
1.1 arguments是什么
arguments是当前函数的一个内置对象,且只有函数才有这个对象,所有函数都有这个内置对象。
此外,它是一种伪数组。具有数组的某些特性。
1.2 arguments的作用
当我们不确定有多少个参数传递的时候,可以用 arguments 来获取。因为 arguments
对象中存储了传递的所有实参。
1.3 arguments的特性
arguments并不是真正意义上的数组,而是一种伪数组,具有数组的一些特性,也不具有某些特性。
1.4 使用arguments求任意个数的最大值
代码:
<script> // 利用函数求任意个数的最大值 function getMax() { // arguments = [1,2,3] 已经把实参的值存储到数组(对象)中了 var max = arguments[0]; for (var i = 1; 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>
结果:
二、函数可以调用另外一个函数
因为每个函数都是独立的代码块,用于完成特殊任务,因此经常会用到函数相互调用的情况。
代码:
function fn1() { console.log(111); fn2(); console.log('fn1'); } function fn2() { console.log(222); console.log('fn2'); } fn1();
结果:
三、函数的4个案例(加强复习)
代码:
function getReverse(arrVitual) { var arrNew = []; for (let i = arrVitual.length - 1; i >= 0; i--) { arrNew[arrNew.length] = arrVitual[i]; } return arrNew; } // var arrActual = ['red', 'yellow', 'orange', 'green', 'blue', 'purple']; var arrActual = []; var num = Number(prompt('请输入数组长度:')); for (let i = 0; i < num; i++) { arrActual[i] = prompt('请输入第' + (i + 1) + '个数组元素(字符串):'); } var resultArr = getReverse(arrActual); // result是一个数组 (函数返回的是一个数组) alert('原始数组为: [ ' + arrActual + ' ]\n' + '翻转后的数组为: [ ' + resultArr + ' ]');
效果:
代码:
function bubbleSort(arrVitual) { var temp; var operation = prompt('升序请输入1,降序请输入2'); switch (operation) { case '1': for (let i = 0; i <= arrVitual.length - 1; i++) { //趟数 for (let j = 0; j < arrVitual.length - 1 - i; j++) { //每一趟的次数 if (arrVitual[j] > arrVitual[j + 1]) { temp = arrVitual[j]; arrVitual[j] = arrVitual[j + 1]; arrVitual[j + 1] = temp; } } } break; case '2': for (let i = 0; i <= arrVitual.length - 1; i++) { //趟数 for (let j = 0; j < arrVitual.length - 1 - i; j++) { if (arrVitual[j] < arrVitual[j + 1]) { temp = arrVitual[j]; arrVitual[j] = arrVitual[j + 1]; arrVitual[j + 1] = temp; } } } break; default: break; } return arrVitual; } var arrActual = []; var num = Number(prompt('请输入数字的个数:')); for (let i = 0; i < num; i++) { arrActual[i] = Number(prompt('请输入第' + (i + 1) + '个数:')); } var resultArr = bubbleSort(arrActual); alert('数据排序后为: ' + resultArr);
效果:
代码:
function isLeapYear(y) { if (y % 4 == 0 && y % 100 != 0 || y % 400 == 0) { return true; } return false; } var year = Number(prompt('请输入任意的年份:')); var result = isLeapYear(year); result == false ? alert(year + '年不是闰年') : alert(year + '年是闰年');
效果:
(用到一个函数调用另一个函数)
代码:
function isLeapYear(y) { if (y % 4 == 0 && y % 100 != 0 || y % 400 == 0) { return true; } return false; } function Day(yy) { var days; var temp = isLeapYear(yy); //将函数Day的形参作为实参 传给函数IsLeapYear的形参y if (temp == true) { days = 29; } else { days = 28; } return days; } var year = Number(prompt('请输入任意的年份:')); var result = Day(year); alert(year + '年的二月份有【' + result + '】天');
效果:
代码:(简化版)
// 判断是否为闰年的函数 function isRunYear(year) { // 如果是闰年我们返回 true 否则 返回 false var flag = false; if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) { flag = true; } return flag; } // 用户输入年份,输出当前年份2月份的天数 闰年的二月份有29天 function backDay() { var year = prompt('请您输入年份:'); // 在函数内部让用户输入,这样参数就可以直接给另一个函数,避免了参数给来给去 if (isRunYear(year)) { // 调用函数,if括号里不加条件 若本身为真的话就执行花括号里的语句 alert(year + '年是闰年,2月份有29天'); } else { alert(year + '年不是闰年,2月份有28天'); } } backDay(); //直接调用 不写参数
效果:
四、函数的声明方式
4.1 自定义函数方式 (命名函数)
4.2 函数表达式方式 (匿名函数)
注意:
(1)fn 是变量名 不是函数名
(2)变量里面存的是值 而 函数表达式里面的变量存的是函数
(3)函数表达式也可以进行传递参数,形参写到function()里,实参写到fn()里
五、JavaScript作用域
5.1 什么是作用域
作用域就是:起作用和效果的范围。
主要是针对代码名字(变量)在某个范围内起作用和效果,
目的是为了提高程序的可靠性,更重要的是减少命名冲突 。
5.2 作用域的分类
1)全局作用域
在整个script标签中或者是在一个单独的js文件中。
2)局部作用域
在函数内部就是局部作用域。
3)块级作用域
就是用花括号进行包含的范围。比如if { } for { }
5.3 变量的分类
根据作用