首页 > 编程语言 >javascript函数

javascript函数

时间:2024-11-06 22:19:00浏览次数:4  
标签:function 调用 console log javascript 定义 函数

1.1初识函数

1.1.1函数的定义

1.函数用于封装一段特定功能的代码

作用:提高代码的复用性,降低维护的难度(你将实现一个功能多段重复的代码变为一段代码,降低了维护的难度,你将这段代码用一个函数封装,要使用这个功能的时候就调用函数,即可提高代码的复用性)

1.1.2函数的定义与使用

1.函数的定义(定义为动词)四部分组成:1.function关键字 2.函数名 3.参数 4.函数体

function 函数名 ([参数1,参数2,...]){
函数体
}
补充:

1.function是定义函数的关键字

2.函数名可由字母,数字,下划线,和$符号组成,函数名不能以数字开头,且不能是javascript中的关键字

3.参数是外界传递给函数的值,此时的参数成为形参,它是可选的,多个参数之间用“,”分隔

4.“[]”用于在语法中标识可选参数,实际代码不用写“[]”

5.函数体是由函数内所有代码组成的整体,专门用于实现特定的功能

 2. 函数的调用“函数名()”

函数名称([参数1,参数2,...])
补充:

1.这里的参数称为实参

2.实参的个数可以使零个,一个或多个。通常情况下,函数的实参列表与形参列表顺序对应。当函数体内不需要参数,调用时可以不传参。

3.若在调用函数需要返回函数的结果,在函数体中可以使用return关键字返回,这个结果称为返回值。

4.函数的定义调用顺序不分前后(这个就和函数表达式不同)

1.1.3函数参数的设置

函数在定义时根据参数的不同,可分两种类型,一种是无参函数,指的是在定义函数时不设置参数的函数。另一种是有参函数,指的是在定义函数时设置了参数的函数。

1.无参函数

<script>
    function greet() {
      console.log("Hello my name is 木木艾薇")
    }
greet()

补充:

即使函数的功能不需要设置参数,小括号“()”也不能省略

2.有参函数

<script>
    function bigNum(a, b) {
      a = parseFloat(a)
      b = parseFloat(b)
      return a > b ? a : b
    }
 console.log(bigNum(1, 3))

知识加油站:

1.含有默认值的函数

在设置函数的形参时,还可以为其指定默认的值。当调用者未传递函数参数时,函数将使用默认值进行操作。

<script>
    function greet(name, say = 'my name is') {
      console.log(say + name)
    }
greet("木木艾薇")
  </script>

2.剩余参数

在定义函数时,除了可以指定具体数量的形参,还可以利用“...变量名”的方式动态接收用户传递不确定数量的实参

 <script>
    function transferparm(num1, ...theNums) {
      console.log(theNums)
    }
 transferparm(0, 1, 2, 3, 4)
  </script>
补充:

实参中的0传到了形参num1里

如果定义transferParam()函数时,所有的参数都不确定,则可以将上述代码修改成以下形式

 <script>
    function transferparam(...theNums) {
      console.log(theNums)
    }
  transferparam(1, 2, 3, 4)
 </script>

1.14获取函数调用时所传递的所有实参

(小补充:javascript语法 ——对象.属性,对象.语法,对象.事件 )

若不能确定函数的形参个数,定义函数时可以不设置形参,在函数体中直接通过arguments对象获取函数时所调用的实参,arguments是当前函数的一个内置对象,所有函数都内置了一个arguments对象,该对象保存了函数调用时所传递的所有实参。实参的个数可通arguments.length获取,具体的实参可以通过数组遍历方式获取。

<script>
    function number() {
      console.log(arguments.length)
      console.log(arguments)
 }
    number(1, 2, 3, 4, 6)
  </script>

1.2函数内外变量的作用域

我们知道变量要先定以后使用,但是并不意味着,定义后的变量就可以在任意位置使用该变量。

<script>
    function judge() {
      var age = 18
    }
    judge()
    console.log(age)

它的结果是什么呢?18吗?

 上述代码执行后,控制台出现age is not defined 错误信息,表示age变量没有定义。之所以出错是因为age变量只能在judge()函数体内使用。由上述示例可知,变量需要在被定义的的区域才能被使用,这个区域是变量的作用范围。

1.全局变量

定义:不在任何函数内定义(显式定义)的变量或在函数内省略let定义(隐式定义)的变量被称为全局变量,它的作用域是全局作用域,在同一个页面文件中的所有脚本都可以使用。

2.局部变量

定义:在函数体内利用let关键词声明的变量称为局部变量,它的作用域被称为函数作用域,仅在函数体内有效。

<script>
    let a = "one"
    function test() {
      var a = "two"
      console.log(a)
    }
test()
console.log(a)

有结果可知第一个a是全局变量,第二个a是局部变量

总结:那我们该如何辨别全局变量和局部变量呢?

我们应该明白局部变量要满足两个条件,在函数体内+用let关键词声明,也就是说在函数体外,或者没有在函数体内用let关键字声明都是全局变量。

1.3函数进阶

1.3.1函数表达式

函数表达式是指将函数值赋值给变量的表达式的,通过“变量名()”的方式即可完成函数的调用,小括号“()”可传入参数。函数的表达式也是javascrpt中另一种实现自定义函数的方式。

 <script>
    let name = function name1(num1, num2) {
      return num1 + num2
    }
     document.write(name("我是", "木木艾薇")) 
  </script>

用document.write的作用是让它显示在页面上。

补充:

函数表达式与函数的的定义方式几乎相同,那他们有什么不同吗?

1.函数表达式的定义必须在调用前,函数定义的方式不限制定义与调用的的顺序

 <script>
    document.write(name("我是", "木木艾薇"))
    let name = function name1(num1, num2) {
      return num1 + num2
  }
  </script>

解释:报错了,报错的原因就是调用在定义的前面。

函数定义的方式:

<script>
    document.write(sum(1, 3))
    function sum(num1, num2) {
      return num1 + num2
    }
</script>

函数定义的方式没有报错

2.函数表达式调用的方法通过“变量名()”不能通过“函数名()”的方式调用

1.3.2匿名函数

为什么需要匿名函数呢?在项目开发中,通常需要团队合作来完成一个完整的项目,每个程序员编写代码实现功能时,经常会定义一些函数,再给这些函数命名时经常会遇到与其他人取相同名字的情况,就会出现命名冲突的情况,那如何解决这个问题?,使用javascript中的匿名函数可以有效避免函数命名冲突问题。

定义:所谓匿名函数,指的时没有名字的函数,也就是在定义函数时省略函数名。

1.函数表达式中省略函数名

利用函数表达式实现匿名函数,调用时使用“变量名”,示例代码如下

 <script>
    let fn = function (num1, num2) {
      return num1 + num2
 }
    console.log(fn(1, 3))
  </script>
在上述示例中,访问匿名函数需要使用fn()来调用
补充:

通常情况下,如果函数的返回值需要使用变量来接收时,可以使用函数表达式来实匿名函数的调用,并且可以通过“变量名()”的方式调用多次。

2.匿名函数的自调用

匿名函数的自调用就是将匿名函数写在小括号内,然后进行调用。示例代码如下

<script>
    (function (num1, num2) {
      console.log(num1 + num2)
    })(2, 3)
 </script>

在上述示例中,使用小括号“()”标注匿名函数,匿名函数的小括号“()”表示给匿名函数传递参数并立即执行,完成函数的自调用

补充:

自调用只能调用一次。在开发中,如果希望某个功能实现一次,可以使用匿名函数的自调用方式来完成。

3.处理事件

使用匿名函数处理事件中在开发项目中经常使用,例如使用匿名函数处理单击事件,示例代码如下

<body>
  <button id="bt1">你好</button>
  <script>
//用document.getElementById方法获取了页面上ID为bt1的元素(即上面提到的按钮),然后将这个元素赋值给bt1变量。这样,bt1变量就引用了那个按钮,之后我们就可以通过这个变量来操作按钮了。
    let bt1 = document.getElementById("bt1")
    bt1.onclick = function () {
      alert("hi,every body")
    }
 </script>
</body>

知识加油站:

箭头函数是ES6新增函数,它用于简化函数定义语法。小括号可以放置参数,箭头函数的语法格式如下

()=>{}

 从上述语法中可以看出箭头函数是匿名函数。将箭头函数赋值给一个变量,然后可以通过变量名实现箭头函数的调用。

<script>
    let fun = (num1, num2) => {
      return num1 + num2
    }
    console.log(fun(1, 2))

箭头函数存在两种特殊情况

(1)省略大括号和return关键词

在箭头函数中,当函数体只有一段代码,且代码的执行结果就是函数的返回值,可以省略函数体的大括号以及return关键词。

<script>
  let fn=(num1,num2)=>num1+num2
 </script>

上述代码示例中,函数体内只有一句代码“num1+num2”且函数的返回值是“num1+num2”的结果因此可以省略大括号“{}”和return关键词

(2)省略参数外面的小括号

在箭头函数中,当参数只有一个时,可以省略外面的小括号。

  <script>
    let fn=name=>{
      console.log(name)
 }
  </script>

1.3.3回调函数

什么是回调函数?回调函数就是在函数里调用别的函数。

<script>
    function cooking(food) {
      //厨师做菜
      return food = flavour(food)

    }
    function flavour(food) {
      let food1 = food + "特辣"
      return food1
    }
    console.log(cooking("鱼香肉丝"))

  </script>

 

嘿嘿 。

1.4嵌套与递归

1.4.1函数的嵌套与作用域

在开发项目中,一个复杂的功能往往需要定义多个函数来完成,对于其中一个函数而言。它可能依赖另一些函数才能运行。但是,如果我们希望这些依赖的函数只能在函数的内部访问,其他函数不能访问,这时候可以把这些依赖函数定义在本函数内部,这样在一个函数内部定义其他函数就形成嵌套函数。对于嵌套函数而言,内层函数只能在外层函数作用域执行,在内层函数的执行过程中,若需要引入某个变量,首先会在当前作用域中寻找,若未找到,则继续向上一层作用域寻找,直到全局作用域,我们将这种链式的的查询关系称为作用域链。代码示例如下

 <script>
    let i = 26
    function fn1() {            //定义第一个函数
      let i = 20
      function fn2() {            //定义第二函数
        function fn3() {          //定义第三个函数
          console.log(i)
        }
        fn3()
      }
      fn2()
    }
    fn1()
  </script>

控制台输出的结果为20,说明i的值为fn1()函数内定义i的值。对于嵌套函数fn3()来说,输出变量i的过程是先从本函数内部去寻找变量i是否存在,很明显fn3()函数内部没有定义变量i。接着向上层fn2()寻找,fn2()中也不存在变量i的定义。继续向上层fn1()寻找fn1()中存在变量i的定义,因此控制台输出的i值为20. 

1.4.2递归调用

定义:递归调用是一种函数嵌套调用中的一种特殊调用,它指的是是一个函数在其函数体内调用自身的过程,这种函数称为递归函数,递归可以利用简单的代码实现复杂的计算,需要注意的是递归调用必须要加退出条件。

为了让大家更好的理解递归调用,下面通过根据用户输入的计算指定数据的阶乘案例进行演示。定义factorial()函数。利用递归函数调用实现阶乘计算。

<script>
    function factorial(n) {
      if (n == 1) {
        return 1
      }
      return n * factorial(n - 1)//自己调用自己
    }
    let n = prompt("求n的阶乘 \n n是大于等于1的正整数,如2的表示2!。")
    n = parseInt(n)
    if (isNaN(n)) {
      console.log("输入的n值不合法")
    } else {
      console.log(n + "的阶乘为:" + factorial(n))
    }

1.5闭包函数

1.5.1什么是闭包函数

所谓闭包函数,指的是有权访问另一函数作用域内变量(局部变量)的函数。

作用:

1.在函数外部读取函数的内部变量

2.让变量始终保持在内存中,直到页面关闭

闭包函数常见的实现方式在一个函数A内部创建另一个函数B,然后将函数B作为函数A的返回值。当调用函数A后,调用者就会得到函数B,通过函数B来访问A中的局部变量。

1.5.2闭包函数的实现

 <script>
    function hs1() {
      let number = 0
      function hs2() {
        ++number
        console.log("我被调用第" + number + "次")
      }
      return hs2
    }
    let hs = hs1()
    hs()
    hs()
    hs()

  </script>

这段代码实现了hs1()的局部变量number的访问。使用闭包函数实现在hs2()函数中访问hs1()函数内部的局部变量并输出了hs2()函数被调用的次数。

标签:function,调用,console,log,javascript,定义,函数
From: https://blog.csdn.net/2301_81827214/article/details/143446552

相关文章

  • javascript模块 (Module) 简介
    https://blog.csdn.net/chehec2010/article/details/119804381   随着ES6的出现,js模块已经成为正式的标准了。曾经为了解决js模块问题而发展起来的民间秘籍,requireJs(AMD)、SeaJs(CMD)、Node(CommonJs),已经或者不久的将来会成为历史。了解历史也是很重要的,因为正式标准就是......
  • 编程之路,从0开始:函数与递归
            Hello大家好!很高兴我们又见面了!        给生活添点passion,开始今天的编程之路!目录1、函数定义及调用2、函数声明3、函数的嵌套调用和链式访问4、递归1、函数定义及调用        什么是函数呢?        函数就是一个固定的一......
  • 「C/C++」C++标准库 之 #include<functional> 函数模板库
    ✨博客主页何曾参静谧的博客......
  • Scala的高阶函数
    在函数式编程中,高阶函数(Higher-OrderFunction)是核心概念之一,它们可以接受其他函数作为参数,或者返回函数作为结果358。这使得函数可以像普通值一样被传递和操作,从而实现更灵活和抽象的编程方式56。 在Scala中实现高阶函数1.作为参数的函数:在Scala中,函数可以作为参数传递给......
  • 0基础学Python——类的单例模式、反射函数、记录类的创建个数、迭代器、生成器及生成
    0基础学Python——类的单例模式、反射函数、记录类的创建个数、迭代器、生成器及生成器练习类的单例模式定义代码演示反射函数代码演示记录类的创建个数迭代器定义特点生成器定义特点写法生成器练习生成器生成1-无穷的数字生成器生成无穷个素数类的单例模式定义......
  • 0基础学Python——面向对象-可迭代、面向对象-迭代器、call方法、call方法实现装饰器
    0基础学Python——面向对象-可迭代、面向对象-迭代器、call方法、call方法实现装饰器、计算函数运行时间面向对象--可迭代实现方法面向对象--迭代器实现方法call方法作用call方法实现装饰器代码演示计算函数运行时间代码演示面向对象–可迭代把对象看做容器,存储......
  • c语言入门4——函数
    4-1判断数字字符编写函数,判断指定的字符是否是数字字符,如果是函数返回1,否则函数返回0.要求在主调函数中输入该字符,调用函数并输出判断结果。输入格式:在一行中给出1个字符。输出格式:对于给定输入的字符,输出判断结果yes或no。输入样例:6输出样例:yes输入样例:H输......
  • C++:多态中的虚/纯虚函数,抽象类以及虚函数表
    我们在平时,旅游或者是坐高铁或火车的时候。对学生票,军人票,普通票这些概念多少都有些许耳闻。而我们上篇文章也介绍过了继承与多继承。如果这些票我们都分别的去写一个类,当然很冗余,这里我们便可以去使用继承,我们假设我们的票价是由一个票价函数控制的,如果子类与父类中有着同名的......
  • [Javascript] Iterate over Object
    const[a,b]={a:3,b:4,};console.log(a,b);//TypeError:{(intermediatevalue)(intermediatevalue)}isnotiterable Howtomakeitworkwithouttouchoriginalcode?Weneedtouse[Symbol.iterator]forObject.prototype;Object.prototype[Sym......
  • 深入理解JavaScript中的闭包
    写在前面在JavaScript中,闭包是一个强大的概念,它允许我们创建私有变量和函数,并在需要时访问它们。虽然闭包可能看起来有些神秘,但实际上它是基于JavaScript的词法作用域和函数的特性。理解闭包对于编写高效、可维护的JavaScript代码至关重要。什么是闭包?闭包是指一个函数能......