JavaScript基础第四天

函数 function

被设计为执行特定任务的代码块

有利于简洁代码重复使用

 <script>
    声明 
   function 函数名(){
     函数体
   }
   调用函数
   函数名()

  function sayHi(){
    console.log('Hi');
  }
  sayHi()
  sayHi()
  // 调用几次显示几次
  </script>

参数

通过向函数传递参数,可以让函数更加灵活多变,参数可以理解成是一个变量。

声明(定义)一个功能为打招呼的函数

  • 传入数据列表

  • 声明这个函数需要传入几个数据

  • 多个数据用逗号隔开

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>JavaScript 基础 - 函数参数</title>
</head>
<body>

  <script>
    // 声明(定义)一个功能为打招呼的函数
    // function sayHi() {
    //   console.log('嗨~')
    // }
    // 调用函数
    // sayHi()
	

    // 这个函数似乎没有什么价值,除非能够向不同的人打招呼
    // 这就需要借助参数来实现了
    function sayHi(name) {
      // 参数 name 可以被理解成是一个变量
      console.log(name)
      console.log('嗨~' + name)
    }

    // 调用 sayHi 函数,括号中多了 '小明'
    // 这时相当于为参数 name 赋值了
    sayHi('小明')// 结果为 小明

    // 再次调用 sayHi 函数,括号中多了 '小红'
    // 这时相当于为参数 name 赋值了
    sayHi('小红') // 结果为 小红
  </script>
</body>
</html>

函数求和案例 

 <script>
    // function 函数名(传参列表){
    //   // 函数体
    // }
    function getSum(start=0,end=0){
      //形参
      let sum =0
      for(let i=start;i<=end;i++){
        sum +=i
      }
      console.log(sum);
    }
      // 函数的传参本质就是赋值的过程 实参给形参
    // 开发过程中实参尽量和形参保持一致
    getSum(1,50)//实参
  // 调用函数时写在函数名右边括号里的是实参
   // 声明函数时写在函数名右边括号里的是形参

    // 函数求和
    function getSum1 (num1=0 ,num2=0){
      console.log(num1 +num2);
    }
    getSum1 (1,2)
    
  </script>

 参数默认值

 <script>
   /*  // 形参可以看作是变量如果变量不赋值 得到的结果就是undefined
    function getSum2(x=0,y=0){
     console.log(x+y);
    }
    // getSum2(10,20)
    getSum2()
  //  实参不赋值的到NaN  */
  function getSum(arr=[]){
  let sum =0
  for(let i=0;i<arr.length;i++){
    sum =sum+arr[i]
  }
  console.log(sum);
  }
  getSum([1,2,3,4,5])
  </script>

实参可以是变量

  <script>
    let sum=0
    function getSum(n=0,m=0){
 for(let i=n;i<=m;i++){
sum =sum+i
 }
 console.log(sum);
    }
    let num1=+prompt('请您输入第一个数')
    let num2=+prompt('请您输入第二个数')
    getSum(num1,num2)//实参可以是变量
  </script>

返回值

  1. 在函数体中使用return 关键字能将内部的执行结果交给函数外部使用

  2. 函数内部只能出现1 次 return,并且 return 下一行代码不会再被执行,所以return 后面的数据不要换行写

  3. return会立即结束当前函数

  4. 函数可以没有return,这种情况默认返回值为 undefined

 <script>
    function getMax(x,y){   
  return x>y ? x:y
    }
  let max=getMax(1,2)
  console.log(max);
  </script>

求任意数组最大值案例

<script>
    // 求任意两个数之间的最大值
function getSum(x=0,y=0){
 
  if(x>y){
    return x
  }else{
return y
  }
}
//  let num1=+prompt('请输入第一个值')
//   let num2=+prompt('请输入第二个值')
// let res =getSum(num1,num2)
let res =getSum(1,2)
console.log(res);
// 求任意数组里最大值
// 声明函数
function getArrMax(arr=[]){
  // 声明最大值
let max=arr[0]
// 遍历数组
for(let i=1;i<arr.length;i++){
  // 条件判断
  if(max<arr[i]){
    max=arr[i]
  }
}
return max //for循环外
}
let max1= getArrMax([50,40,30,80,90,45,31,12])
console.log(max1);

  </script>

求任意数组的最大值和最小值

<script>
// 求任意数组的最大值和最小值并返回
//声明函数
function getNewArr(arr=[]){
let max=arr[0]
let min=arr[0]
for(let i=1;i<arr.length;i++){
  if (max <arr[i]){
  max=arr[i]
  }
  if(min>arr[i]){
    min=arr[i]
  }
}
return [max,min]//返回值
}
let res1= getNewArr([50,40,30,80,90,45,31,12])
console.log(`最大值是${res1[0]}`);
console.log(`最小值是${res1[1]}`);
</script>

 函数的调用细节

<script>
    // return内部不需要输出结果,而是返回结果
    //简单理解函数返回值 函数内部不需要输出,需要返回一个结果给他人使用
    // return返回结果 定义一个变量名存储结果 输出这个变量名即可
    function fn(){
      return 20
    }//相当于执行了fn()=20
  //只有函数遇到return 就会把后面的结果返回给调用者函数名()=return后面的数据
  let res =fn() //存储 fn()结果,便于使用
  console.log(res);//实际开发中规范写法
    // console.log(fn());

    // 函数返回值细节注意事项
    function getSum1 (num1=0 ,num2=0){
      return num1+num2
    }
    let res1=getSum1(1,2)
    console.log(res1);
    //return后面的代码不会执行
    //return后面的代码不要换行 否则会返回undefined
    // 3.return可以没有但是默认情况下会返回undefined

    function getSum1 (x ,y){
      return x+y
    }
    let res2=getSum1(1,2)
    console.log(res1);
    // 执行流程
    // (1)先执行传参,将实参数值传参给形参
      //  (2)函数体
      // (3)返回值 函数的调用者
  </script>

函数细节

<script>
    //1. 函数名相同后面的会覆盖前面的
    function fn(){
      console.log(111);
    }
  fn()
function fn(){
      console.log(222);
    }
  fn()
  // (2)参数 不一致
 function getSum1 (x ,y){
  console.log(x+y);
    }
    // 2.1 实参有多余形参 剩余的参数不参与运算
    // getSum1(1,2,3)
// 2.2少于
// getSum1(1)//1+undefined =NaN
    getSum1(1,2)
  </script>

作用域

通常来说,一段程序代码中所用到的名字并不总是有效和可用的,而限定这个名字的可用性的代码范围就是这个名字的作用域。

作用域的使用提高了程序逻辑的局部性,增强了程序的可靠性,减少了名字冲突。

全局作用域

作用于所有代码执行的环境(整个 script 标签内部)或者一个独立的 js 文件

处于全局作用域内的变量,称为全局变量

 <script>
    // 全局变量在任何区域都可以访问
    // 1.全局作用域 对函数外部或者整个script有效
   num=10 //全局变量
    function fn(){
      fn()
    }
console.log(num);
// 2.局部作用域
// 局部变量只能在当前函数访问
function fn(){
  let str='张三'
  
}
fn()
console.log(str);//undefined 不能访问

let num=20 
    function fn(){
      let num=10 
      console.log(num);//10
    }
    fn()

   // 访问原则 在能够访问到的情况下 先局部局部没有在找全局
  //  就近原则 先局部后全局
  </script>

局部作用域

作用于函数内的代码环境,就是局部作用域。 因为跟函数有关系,所以也称为函数作用域。

处于局部作用域内的变量称为局部变量

如果函数内部,变量没有声明,直接赋值,也当全局变量看,但是强烈不推荐

但是有一种情况,函数内部的形参可以看做是局部变量。  

匿名函数

函数可以分为具名函数和匿名函数

匿名函数:没有名字的函数,无法直接使用。

<script>
    //具名函数调用可以写到任意位置
    //匿名函数必须先声明函数表达式后调用
    //匿名函数 函数表达式
    let fun= function(x,y){
      // console.log('我是匿名函数');
      console.log(x+y);
    }
    //调用
    fun(2,3)
  </script>

立即执行函数

 

(function(){ xxx  })();
(function(){xxxx}());
<script>
    //立即执行函数,就是为了避免全局污染
    // 多个执行分号隔开
    // (function(){
    //   console.log(111);
    // })();
   /* (function(){
      let num =10
    })();
    (function(){
      let num =20
    })() */
    // 第一种写法
    (function (x,y){
      console.log(x+y);
      let  num =30
      let arr=[]
    })(1,2);
    //第二种写法
    (function(x,y){
      console.log(x+y);
      let  num =30
      let arr=[]
    }(4,6)) 
  </script>

 逻辑中断

  // 逻辑与 短路
    // 如果表达式1 结果为真 则返回表达式2 
    // 如果表达式1 结果为假 则直接返回表达式1

 // 逻辑或 短路
     // 如果表达式1 结果为真 则返回表达式1
    //  如果表达式1 结果为假 则直接返回表达式2 

 

<script>
  // 逻辑与 短路
    // 如果表达式1 结果为真 则返回表达式2 
    // 如果表达式1 结果为假 则直接返回表达式1
    console.log(33&&66);//66
    console.log(false &&123);//false
    // 逻辑或 短路
     // 如果表达式1 结果为真 则返回表达式1
    //  如果表达式1 结果为假 则直接返回表达式2
    console.log(123||456);//123
    console.log(false ||123 ||456);//123
  </script>

计算剩余时间案例

 <script>
    // 用户输入一个数
    let second =+prompt('请您输入一个值')
    // 函数封装
    function getTime(t){
   let d= parseInt(t / 60 / 60 /24 );
   let h = parseInt(t / 60 / 60 % 24 ); //计算剩余的小时 
   let m = parseInt(t  / 60 % 60);//计算剩余的分钟 
   let s = parseInt(t  % 60);//计算剩余的秒数
    d=d<10? '0'+h:h  //三元运算符判断
    h= h<10 ? '0'+h :h 
    m= m<10 ? '0'+m :m 
    s= s<10 ? '0'+s :s 
    return `转换离毕业之后是${d}天${h}小时${m}分${s}秒`
   }
   let res= getTime(second)
console.log(res);
  </script>

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值