函数
函数的声明
function 函数名(参数) { 函数体 }
var 函数名 = function(参数) { 函数体 }
函数的调用
函数名();
函数参数
参数的作用
是让调用者传递数据给函数
谁传递参数
调用者
谁接收参数
函数接
传参的本质
实参给形参赋值
形参
形式参数, 是在函数内部声明一个变量, 必须省略var
可以是多个
实参
实参的个数 可以不用和形参一致
实参是按照形参的顺序进行赋值
返回值
return 关键字
终止函数体的执行, 给调用者返回函数体执行的结果
如果没有return , 或者return 后面没接具体值, 函数返回值为undefined
如果接了值, 那么就返回该值
函数分类
无参数无返回值
只是单纯执行一段代码 没意义
有参数无返回值
无参数有返回值
有参数有返回值
用的最多
作用域
全局作用域
全局变量
就是可以在全局作用域范围内起作用的变量
在任何地方都可以起作用
局部作用域(函数作用域)
函数可以用来划分作用域
函数内部声明的变量就是局部变量, 只能在函数内部起作用
块级作用域
ES6中的let和const来实现块级作用域
js中所有的代码块都可以分割作用域 (代码块 指的是 带有大括号的 函数 if分支结构 循环结构等)
let
let 在同一块级作用域内不能重新声明 但是可以重新赋值
var有变量提升, let没有变量提升
let 有暂时性死区的特性 ( 使用let声明的变量 在声明前不能使用 否则就会报错 )
let 声明的变量 只在所处的块级作用域内有效
const
是用来声明常量 不能重新声明 也不能重新赋值
作用域链是怎么来的 ?
我们默认js代码都处于全局作用域中, 当我们声明一个函数之后, 这个函数就分割出了一个局部作用域, 然后我在这个函数的函数体里面
再声明一个函数, 又会开辟出新的局部作用域, 以此类推, 就形成了一个嵌套多层的作用域链
作用域链的访问规则 : 就近原则 先从本级作用域查找, 找不到依次往上找, 找到顶级作用域还没有, 就会报错
练习
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<script>
function area(R){
return (Math.PI*Math.pow(R,2)).toFixed(2);
}
for(var i=0;i<101;i++){
// console.log("半径为"+i+"的圆的面积为:"+area(i));
}
function maxvalue(m,n){
if (m<n) {
return n;
}else{
return m;
}
}
// console.log(maxvalue(6,8));
function maxarray(arr){
var max=-Infinity;
for(var i=0;i<arr.length;i++){
if(max<arr[i]){
max=arr[i];
}
}
return max;
}
// console.log(maxarray([15,24,658,87,1,56,4856,156,48,6]));
function maxnum(num1,num2,num3){
var arr=[num1,num2,num3];
return maxarray(arr);
}
console.log(maxnum(88,96,54));
</script>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<script>
function sum(num1,num2){
return num1+num2;
}
function merchant(num1,num2){
return num1/num2;
}
function difference(num1,num2){
return num1-num2;
}
function product(num1,num2){
return num1*num2;
}
console.log(sum(1,2),merchant(4,2),difference(5,1),product(6,6));
function maxnum(num1,num2,num3){
var res1 = num1>num2?num1:num2;
return res1>num3?res1:num3;
}
console.log(maxnum(56,95,86));
function sortnum(num1,num2,num3){
var arr=[num1,num2,num3];
for(var i=0;i<arr.length;i++){
for(var j=0;j<arr.length-i-1;j++){
if(arr[j]>arr[j+1]){
[arr[j],arr[j+1]]=[arr[j+1],arr[j]];
}
}
}
return arr;
}
console.log(sortnum(56,95,86));
</script>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<script>
//1
function contrary(arr){
for(var i=0;i<arr.length/2;i++){
[arr[i],arr[arr.length-1-i]]=[arr[arr.length-1-i],arr[i]];
}
return arr;
}
// var arr=[10,20,30,40,50];
// console.log(contrary(arr));
//2
function sortarr(arr,sort){
for(var i=0;i<arr.length;i++){
for(var j=0;j<arr.length-1-i;j++){
if (arr[j]>arr[j+1]) {
[arr[j],arr[j+1]]=[arr[j+1],arr[j]];
}
}
}
if (sort) {
return arr;
}else{
return contrary(arr);
}
}
// var arr=[40,30,50,10,20];
// console.log(sortarr(arr,true)); //true 从小到大 false 从大到小
//3
function isLeapyear(year){
return year % 400 ==0 || (year % 100 != 0 && year % 4 == 0);
}
// console.log(isLeapyear(2019),isLeapyear(1900),isLeapyear(2020),isLeapyear(3028));
//4
function judgeday(year,month,day){
return (month-1)*31+day-(month>4)-(month>6)-(month>9)-(month>11)-3*(month>2)+(month>2 && (isLeapyear(year)));
}
// console.log(judgeday(2020,12,31));
//4
function randomcolor(){
var color = "#";
for(var i=0;i<6;i++){
color += Math.floor(Math.random()*16).toString(16);
}
return color;
}
// console.log(randomcolor());
</script>
</body>
</html>