Js-基础-函数

128 阅读6分钟

本文已参与「新人创作礼」活动, 一起开启掘金创作之路。

函数

函数

函数是由事件驱动的或者当它被调用时执行的可重复使用的代码块

函数可以把具有相同或相似逻辑的代码“包裹”起来,通过函数调用执行这些被“包裹”的代码逻辑,这么做的优势是有利于精简代码方便复用

声明(定义)一个完整函数包括关键字、函数名、形式参数、函数体、返回值5个部分

1657977560417.png

函数使用

// 1 声明函数
 function  函数名(){
    函数体
} 
// 2. 函数调用
函数名()
​
function eatMango(eat){
      let str = eat +'芒果';
      return str;
    }
​
document.write(eatMango('吃')); //吃芒果

声明(定义)的函数必须调用才会真正被执行,使用 () 调用函数。

注:函数名的命名规则与变量是一致的,并且尽量保证函数名的语义。

注意:一般我们不在函数内部处理数据(打印操作等..)用return让数据作为返回值让调用者处理数据

函数封装

就是把一个或者多个功能通过函数封装起来,对外只提供一个简单的函数接口。也就是吧这些功能写在函数体里面,当我们使用时直接调用函数。

函数传参

形参:声明函数时写在函数名右边小括号里的叫形参(形式上的参数)

实参:调用函数时写在函数名右边小括号里的叫实参(实际上的参数)

function 函数名(形参1,形参2...) { // 在声明函数的小括号里面是 形参 (形式上的参数)
        //函数体
   }
函数名(实参1,实参2...); // 在函数调用的小括号里面是实参(实际的参数)
// 传递多个参数 参数之间使用逗号隔开function eatMango(eat){ //这里的eat是形式参数
      let str = eat +'芒果';
      return str;
    }
document.write(eatMango('吃')); //这里函数调用时传入实参 '吃',所以打印结果就是 '吃芒果'

函数传参-参数默认值

形参:可以看做变量,但是如果一个变量不给值,默认就是undefined

参数默认值只会在缺少实参参数传递时 才会被执行,所以有参数会优先执行传递过来的实参, 否则默认为 undefined

函数返回值

当调用某个函数,这个函数会返回一个结果出来,这就是有返回值的函数

函数的本质是封装(包裹),函数体内的逻辑执行完毕后,函数外部如何获得函数内部的执行结果呢?要想获得函数内部逻辑的执行结果,需要通过 return 这个关键字,将内部执行结果传递到函数外部,这个被传递到外部的结果就是返回值。

function eatMango(eat){
      let str = eat +'芒果';
      return str;//这个str就是函数的返回值
    }
​
document.write(eatMango('吃')); 
  1. 在函数体中使用return 关键字能将内部的执行结果交给函数外部使用
  2. 函数内部只能出现1 次 return,并且 return 下一行代码不会再被执行,所以return 后面的数据不要换行写
  3. return会立即结束当前函数
  4. 函数可以没有return,这种情况默认返回值为 undefined

作用域

在不同位置声明的变量不是在各个地方都可用的,我们把变量的作用范围叫做作用域

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

全局作用域

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

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

局部作用域

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

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

  1. 全局作用域:整个script标签或者单独js文件 页面的任何地方都可以使用(全局变量)
  2. 局部作用域: 在函数内部声明,只能在函数内部使用 (局部变量)
  3. 块级作用域: 在大括号里面声明的变量(分支和循环),只能在大括号内部使用 必须是let const声明的变量
let like = '吃';//全局变量function eatMango(eat){ //局部变量
      let str = eat +'芒果';  //str 局部变量
      return str;//这个str就是函数的返回值
    }
​
document.write(eatMango(like)); 

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

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

变量访问原则

写在函数内部的局部作用域

如果函数中还有函数,那么在这个作用域中就又可以诞生一个作用域

访问原则:在能够访问到的情况下 先局部,局部没有在找全局

let like = '肉';
function eat(){
    let like = '芒果';
    console.log(like);
}
eat();//芒果
console.log(like);//肉

匿名函数

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

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

//函数表达式
    let fn = function (x, y) {
      // console.log('我是函数表达式')
      console.log(x + y);
    }
    fn(3, 4);
    console.log(fn); //函数
//具名函数就是上边的正常函数   function eat(){}

立即执行函数

场景介绍: 避免全局变量之间的污染

第一种写法: (function(){})()

第二种写法: (function(){}())

// 第一种写法  
(function (x, y) {
    let arr = [];//不影响全局环境
    let num =10;
      console.log(x + y);
    })(1, 2);
// 2.第二种写法
(function (x, y) {
      let arr = [];
      console.log(x + y);
    }(1, 3));
​
//立即执行函数会立即执行

逻辑中断

短路:只存在于 &&|| 中,当满足一定条件会让右边代码不执行

符号短路条件
&&左边为false就短路
||左边为true就短路
// &&左边为true就执行右边,为false执行左边
// || 左边为false就执行右边,为true执行左边
console.log(0&&5); //0
console.log(5&&55);//55
​
console.log(0&&5);//5
console.log(5||55);//5

转换为Boolean型

隐式转换:

1.有字符串的加法 "" + 1 ,结果是 "1"

2.减法 - (像大多数数学运算一样)只能用于数字,它会使空字符串 "" 转换为 0

3.null 经过数字转换之后会变为 0

4.undefined 经过数字转换之后会变为 NaN

    console.log(Boolean('Mango'));//字符串的boolean值为true
    console.log(Boolean('')); //空字符串的boolean值为false
    console.log(Boolean(0)); //0的boolean值为false
    console.log(Boolean(5)); //正数的boolean值为true
    console.log(Boolean(-5)); //负数的boolean值为true
    console.log(Boolean(undefined));//undefined的boolean值为false
    console.log(Boolean(null)); //null的boolean值为false
    console.log(Boolean(NaN)); //NaN的boolean值为false

\