函数
在开发过程中, 一段代码在多个地方执行, 而且不连续执行的时候可以使用函数
function hanshumin(arr){
for(var i=0;i<arr.length;i++){
console.log(arr[i]);
}
}
var str=[10,20,30];
hanshumin(str);
函数声明 :
- 函数声明 function 函数名() {
函数体 : 代码块
}
函数声明的特点 : 只是将一段代码保存在变量里面, 但是不会执行
-
函数调用 调用语法 : 函数名();
特点 : 执行保存在函数体里面的代码
buySmoking(); -
函数的好处 :
(1) 解决代码冗余的问题, 便于维护
(2) 使用方便 -
和循环的区别 :
(1) 作用不一样
循环 : 只能在同一个地方,重复执行同一段代码
函数 : 可以在多个地方, 重复执行同一段代码
(2) 本质不一样
循环 : 只是一种语法, 代表代码重复执行
函数 : 是一种数据类型, 里面存储的是一段代码
函数参数 :
-
函数的参数 : 让调用者可以传递数据给函数
函数参数是在函数内部声明的一个变量 声明的时候, 并没有赋值 我们把它叫做形参(形式参数)
参数声明语法 : function 函数名(形参) {
函数体
}
参数的赋值 : 是发生在调用阶段 我们传递的数据叫做实参(实际参数)
参数赋值语法 : 函数名(实参); -
函数的形参可以是多个 多个形参之间使用逗号隔开 如果调用的时候不传参数(实参), 参数就是undefined, 如果只传一个 那么就是只给第一个
buySmoking(“liuqian”); -
在调用的时候, 实参的个数可以不和形参相等, 实参的赋值是按照形参的顺序进行赋值
-
函数的每一次调用都是独立的
函数返回值 :
break 跳出循环 (终止循环)
return 终止函数的执行, 并将指定的值返回给调用者
作用和break在循环中类似, 对于return以后的函数体代码都不会执行
函数的返回值
返回值就是return 终止函数体执行之后, 返回给调用者的数据
1. 如果没有return 或者return后面没有接值, 那么函数的返回值是undefined
2. 如果return后面接了值, 那么就返回该值
3. return 只能用在函数体中, 用在其他语句中, 会出现报错
参数 :
传参数 : 调用者
接参数 : 函数接
返回值 可以声明一个变量来接收 var 变量名 = 函数名(参数);
参数 返回值
无参数 无返回值 用得少 因为无参数无返回值 就是单纯执行一段代码
有参数无返回值 用得少 只是在函数内部做一些运算, 输出数据
无参数有返回值 用得少
有参数有返回值 用的最多 根据外部传入的数据进行计算, 将运算结果返回给调用者
变量作用域 :
- 什么是变量作用域? 变量作用域就是变量可以起作用范围
- 变量作用域的分类 :
(1) 全局作用域 全局变量 : 就是可以在全局作用域范围内起作用
(2) 局部作用域(函数作用域) : 有函数划分出来的作用域
局部作用域里面声明的变量 叫做局部变量
函数可以分割作用域 就是局部作用域
特殊点 : 所有没有使用var定义的变量都是全局变量
(3) 块级作用域 块级作用域通过let和const关键字来实现
let
作用和var一样 都是用来声明变量的
a. 在同一作用域内 不能重复声明
b. let声明的变量不能在声明前使用
c. 变量的暂时性死区 : 在有一个作用域内 从作用域顶端到变量定义之前
d. let只在块级作用域里面起作用 块级 : 指的是代码块 { }
块级
指的是一对大括号包起来的部分, 函数 if for 这些结构里面声明的变量都只能在对应的大括号里面起作用
const
用来声明常量的, 在同一作用域内, 不能重新声明, 也不能重新赋值
- 最外层函数和在最外层函数外面定义的变量都拥有全局作用域
- 所有未定义直接赋值的变量都拥有全局作用域
- 所有window对象的属性拥有全局作用域
window.name window.location
变量的提升 :
程序在执行时, 变量的声明提升到所在作用域的最顶端, 赋值留在原地, 按照顺序结构执行
作用域:
作用域链是怎么来的 ?
我们默认js代码都处于全局作用域中, 当我们声明一个函数之后, 这个函数就分割出了一个局部作用域, 然后我在这个函数的函数体里面再声明一个函数, 又会开辟出新的局部作用域, 以此类推, 就形成了一个嵌套多层的作用域链
作用域链的访问规则 :
就近原则 先从本级作用域查找, 找不到依次往上找, 找到顶级作用域还没有, 就会报错
var num = 45;
function sum (n1, n2) {
var num = 20; //20
console.log(num);
function f1() {
var num = 40;
console.log(num);
function f2() {
console.log(num);
}
f2();
function f4() {
console.log(f4);
}
}
f1();
}
function f3() {
console.log("f3");
}
console.log(num); // 45
sum();
练习
1.任意圆的面积
var r=+prompt("请输入圆的半径");
function yuan(r){
var sum;
sum=Math.PI*Math.pow(r,2);
return sum;
}
var yuanS=yuan(5);
document.write(yuanS);
document.write("圆的面积为:"+yuan(r));
2.判断任意两个数的大小
var m=+prompt("请输入一个数");
var n=+prompt("再输入一个数");
function panduan(m,n){
return m<n?n:m;
}
document.write("最大值为:"+panduan(m,n));
3.m , n之间所有整数,并判断最大最小值.
function panduan(m,n){
var arr=[];
if(m<n){
for(var i=m;i<=n;i++){
arr[arr.length]=i;
}
console.log("最大值为:"+n+" ","最小值为:"+m+" ",arr+" ");
}else{
for(var i=n;i<=m;i++){
arr[arr.length]=i;
}
console.log("最大值为:"+m+" ","最小值为:"+n+" ",arr+" ");
}
}
console.log(panduan(5,8));
4.输入一个数组判断最大最小值
function panduan(arr){
var max=-Infinity;
var min=Infinity;
for(var i=0;i<arr.length;i++){
if(arr[i]>max){
max=arr[i];
}
if(arr[i]<min){
min=arr[i];
}
}
console.log(max,min);
return "最大值为:"+ max+"最小值为:"+min;
}
str=[10,50,70,40,30,30];
console.log(panduan(str));
5.函数中定义3个数,判断大小
// 方法1
function panduan(x,y,z){
if(x>=y&&x>=z){
return x;
}else if(y>=x&&y>=z){
return y;
}else if(z>=y&&z>=x){
return z;
}
}
console.log(panduan(5,8,1))
// 方法2
function daxiao(m,n){
return m<n?n:m;
}
function panduan(m,n,k){
var num1=daxiao(m,n);
var num2=daxiao(num1,k);
return num2;
}
console.log(panduan(5,8,7));
6.分别定义四个函数,接收两个数字,返回这两个数字的和,商,差,积
var m=+prompt("请输入一个数");
var n=+prompt("请再输入一个数做计算");
function jiafa(m,n){
var s=m+n;
return s;
}
function chufa(m,n){
var v=m/n;
return v;
}
function jianfa(m,n){
var f=m-n;
return f;
}
function chengfa(m,n){
var k=m*n;
return k;
}
console.log("和为:"+jiafa(m,n));
console.log("商为:"+chufa(m,n));
console.log("差为:"+jianfa(m,n));
console.log("积为:"+chengfa(m,n));
7.定义一个函数,接收三个参数,并实现三个变量的排序输出
function paixu(m,n,k){
var arr=[m,n,k];
for(var i=0;i<arr.length-1;i++){
for(var j=0;j<arr.length-1-i;j++){
if(arr[j]>arr[j+1]){
var temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
return arr;
}
console.log(paixu(1,5,2));
8.写一个函数,实现翻转数组,返回一个新数组
例如 fn([10,20,30,40,50]) 得到[50,40,30,20,10]
function fanzhuan(arr){
var newarr=[];
for(var i=arr.length-1;i>=0;i--){
newarr[newarr.length]=arr[i];
}
return newarr;
}
var fn=[10,20,30,40,50];
document.write(fanzhuan(fn));
9.写一个函数,既可以实现对数组排序从小到大,也可以从大到小
提示 函数有两个参数 一个是要排序的数组 二个是排序的方式
别忘记在一个函数体中可以调用另外一个函数哟
function big(arr,arr2){
function paixu(arr){
for(var i=0;i<arr.length-1;i++){
for(var j=0;j<arr.length-1-i;j++){
if(arr[j]>arr[j+1]){
var temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
return arr;
}
function paixu2(arr){
for(var i=0;i<arr.length;i++){
for(var j=0;j<i;j++){
if(arr[i]>arr[j]){
var temp=arr[j];
arr[j]=arr[i];
arr[i]=temp;
}
}
}
return arr;
}
if(arr2==true){
return paixu(arr);
}else{
return paixu2(arr);
}
}
var fn=[10,20,30,40,50];
document.write(big(fn,true));
10.输入一个年份,判断是否是闰年[闰年:能被4整数并且不能被100整数,或者能被400整数]
写一个判断平年闰年的函数
function panduan(year){
if((year%4==0&&year%100!=0)||year%400==0){
return "闰年";
}else{
return "平年"
}
}
document.write(panduan(2004));
11.写一个函数输入某年某月某日,判断这一天是这一年的第几天?
提示:一年中除了二月份的天数不同,其他天数是固定的
function panduan(year,mon,day){
var count=0;
switch (mon){
case 12:
count+=30;
case 11:
count+=31;
case 10:
count+=30;
case 9:
count+=31;
case 8:
count+=31;
case 7:
count+=30;
case 6:
count+=31;
case 5:
count+=30;
case 4:
count+=31;
case 3:
count+=28;
case 2:
count+=31;
case 1:
count+=day;
default:
break;
}
if(((year%4==0&&year%100!=0)||year%400==0)&&mon>2){
count++;
}
return count;
}
document.write(panduan(2008,1,4));
12.写一个函数,随机生成十六进制颜色值比如: #ff6600 16进制指0-f之间的数
function randomColor(){
var color=["0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f",];
var val="#";
for(var i=0;i<6;i++){
val+=color[Math.floor(Math.random()*16)];
}
return val;
}
document.write(randomColor());