首页 > 其他分享 >函数-上

函数-上

时间:2023-09-15 12:03:07浏览次数:29  
标签:定义 代码 变量 解析 fn 函数


函数-上_调用函数


引入:

先问大家一个问题,大家洗过衣服吧?

手动怎么洗?拿个盆,接水,放衣服,倒洗衣粉,洗,涮,拧干挺费劲的,有没有简便的方法?

使用洗衣机,衣服放进去,倒上洗衣粉,按开关,一切就都搞定了

在生活中这样的例子有很多,大到洗衣机空调,小到水龙头剪刀。每个工具都有自己不同的功能。为了生活方便简洁,就会使用这些工具。

程序员是一群很会享受生活的群体,所以在代码中也有很多这样的工具,就是咱们今天要学习的函数。总结:代码中工具 函数

概念:

函数就是具备某个功能的一个工具。是完成某个功能的一段代码。大家以前有没有用过函数呀?

parseInt() alert() 这都是函数,是系统提供的,直接拿来就能用。

系统提供了很多函数,但是并不能包含所有的功能,所以有些功能需要我们自己来写 自定义函数。函数定义好以

后,就可以像系统函数一样使用了,不用再重复写了。

所以经常写的代码,就写一个函数,需要的时候调一下好了。自定义函数怎么写?

定义语法:


函数-上_函数定义_02



当我们定义好函数,并在页面中刷新的时候,会发现这段代码并没有被执行。因为函数定义好后,是不会自动执行的,需要我们进行调用。

函数的调用:


函数-上_调用函数_03



调用的语法很简单,这样我们以后还需要执行函数中的代码的时候,就不用再重写那么多的代码了,只需要简单的将原来定义好的函数进行调用即可。


函数-上_赋值_04



带参数的函数:

函数代码中会发生改变的值用变量来代替,入口是声明函数时的小括号


函数-上_调用函数_05




调用函数的时候,需要给参数赋值


函数-上_调用函数_06



声明函数时候带进去的那个参数叫形参

调用函数的时候给形参进行赋值的实际值是实参

函数的本质

当我们去调用函数的时候,通过函数的名称就可以调用到,那说明我们在定义函数的时候,函数就已经保存起来了,所以下面才能调用出来。

函数定义在内存中的体现:


函数-上_调用函数_07



这段代码,在内存创建了一个空间,名字叫fn,这个空间中存储的数据是函数这整段代码。调用函数,就相当于将这段代码拿出来执行。

匿名函数

既然函数的定义跟变量的定义过程差不多,那函数的定义就可以像变量一样进行。


函数-上_函数定义_08


这是定义一个变量,将函数代码放到变量空间中,这样的函数也是可以正常进行调用的,就使用变量的名称就行:


函数-上_赋值_09



那fn这个函数的名字还能进行调用吗:


函数-上_调用函数_10



这就说明,当将一个函数赋值给一个变量的时候,这个函数的名字就没有用了,所以我们可以将这个函数名称省略:


函数-上_赋值_11



这样还是可以正常调用的:


函数-上_赋值_12



这种没有名字的函数就叫做匿名函数。匿名函数不能单独存在,会报错:


函数-上_赋值_13



除非将这个函数用小括号括起来:


函数-上_调用函数_14



但是这种没有名字的函数就无法调用了,js提供了一个专门用来调用匿名函数的语法:


函数-上_赋值_15



后面加小括号就表示调用,这种定义并调用函数的语法,叫做自调用函数。即,函数定义好立即调用。自调用函数也可以不给函数加小括号,在函数前加感叹号或波浪线:


函数-上_函数定义_16


同样是立即执行的函数。

这种函数也是可以传参数的:


函数-上_函数定义_17



函数的优点:

  1. 实现了代码的可重用性
  2. 实现了模块化编程

我们在使用工具的时候,很多工具需要我们带东西进去,比如洗衣服要放衣服进去,用函数这个工具来说的话,就是需要带参数。

带返回值的函数

之前的函数,在调用后,就是将函数中的代码执行了,没有得到一个结果,如果我们希望函数调用后得到一个结果,在后续的代码中,需要用到这个结果,例:


函数-上_赋值_18



上面的函数是没有办法实现的,此时,需要使用函数的返回。

不是所有的程序的结果都需要输出在页面中,有时候,我们只是想让这一段代码得出一个结果,后续代码得到这个结果后进行后续处理。那么上面的函数显然已经不适用了。我们需要使用函数的返回。

函数返回结果,在函数中使用return关键字,后面跟要得到的结果。


函数-上_调用函数_19



此时调用函数,就得到一个结果,可以将这个结果赋值给变量或进行下一步操作。


函数-上_赋值_20


return关键字除了可以给函数调用返回结果,还可以结束函数运行:


函数-上_赋值_21



我们发现,调用函数后,函数中的输出代码没有执行,也就是return将函数结束了。

return在返回结果的时候,只能返回一个结果,不能返回多个:


函数-上_函数定义_22



调用后的res值得到一个90的结果,就说明return只能得到一个结果,不能得到多个。

return总结:

  1. 终止代码继续运行
  2. 函数运行后返回一个结果,只能返回一个

预解析


函数-上_调用函数_23



所以在正常情况下,变量要使用或函数要调用,都需要提前定义变量或函数。


函数-上_函数定义_24



但我们发现一件比较有意思的事情:先输出变量,然后再定义变量,浏览器不报错;先调用函数,再定义函数,不报错,函数能调用


函数-上_函数定义_25



原因是浏览器执行js代码之前,会有一个预解析的过程:

浏览器中有一段程序专门用来解析js代码, 叫做js解析器。js解析器在执行js代码的时候,分两步进行:

  1. 预解析js代码预解析的过程,就是查找代码中的var和function这两个关键字,找到以后,将变量和函数提前存到内存中,并给他们赋一个初始值,变量的初始值为undefined,函数的初始值为代码段。
  2. 开始按顺序一行一行解读代码

解读代码的时候,会略过变量和函数的定义,因为变量和函数的定义已经提前放在内存中了,提前储存的变量和函数的值会随着代码的解读而发生变化,也就是变量的赋值和函数的调用。

预解析分为变量的预解析和函数的预解析,也就是代码在执行之前先进行解析,将变量和函数的定义放在内存中。但是在打印之后声名过变量的话,情况就不一样了。


函数-上_函数定义_26



代码执行之前先预解析:


函数-上_函数定义_27



开始按照预解析后顺序执行:


函数-上_赋值_28


函数-上_赋值_29

面试题:


// 第1题console.log(num) var num = 100

// 第2题

fn();

function fn() {

console.log(123);

}

// 第3题console.log(fn) fn()

var fn = function () {

console.log(123);

}

// 第4题

fun()

var fn = function () {

console.log('我是 fn 函数')

}

function fun() {

console.log('我是 fun 函数')

}

fn()

fn = 100 fn()

// 第5题

fn()

function fn() {

console.log('我是一个 fn 函数')

}

fn()

var fn = 100 fn()

// 第6题

var fun = 200 fun()

var fun = function () { console.log('我是一个 fun 函数')

}

fun()

// 第7题

var a = b

a = 0

b = 0 console.log(a) console.log(b)

// 第8题console.log(num) if (false) {

var num = 100

}


预解析总结:

  1. 匿名函数赋值给变量的定义方式,预解析时遵循变量的预解析规则,不会将函数代码预解析
  2. 预解析的时候,会将定义提前放在内存中,不会提前将赋值放在内存中
  3. 如果变量名和函数名同名了,保留函数预解析,忽略变量预解析因为函数预解析其实包含了赋值的过程,函数定义放在内存中的时候将函数的代码也放在内存中
    变量的预解析只有空间,没有值,所以如果是先预解析变量,那后面的函数预解析赋值就将空间中放入了值,如果是先预解析的函数,再次预解析变量的时候,空间已经存在了,再次定义空间也是没有意义的。
  4. 省略var定义的变量是不会有预解析的
  5. js代码如果报错了,那后面的代码就不会执行了
  6. 不会执行的代码中有变量或函数定义也会预解析,因为预解析在执行之前。

函数的嵌套

函数结构中的大括号,里面放的是代码段,既然是代码段,就可以写判断、循环甚至函数代码,这样就形成了函数的嵌套。

函数的大括号中可以写函数的定义,可以写函数的调用:


函数-上_赋值_30



函数的调试


函数-上_赋值_31


标签:定义,代码,变量,解析,fn,函数
From: https://blog.51cto.com/u_16259380/7479688

相关文章

  • 05_函数(下)
    函数(下)作用域(重点)什么是作用域,就是一个变量可以生效的范围变量不是在所有地方都可以使用的,而这个变量的使用范围就是作用域全局作用域全局作用域是最大的作用域在全局作用域中定义的变量可以在任何地方使用页面打开的时候,浏览器会自动给我们生成一个全局作用域win......
  • DATEADD日期函数的使用
     转自:https://www.cnblogs.com/xyao1/p/9322168.htmlDATEADD日期函数的使用 在当前日期加上几天:https://www.cnblogs.com/shitaotao/p/7648198.html计算本月的第一天:https://www.cnblogs.com/lcyuhe/p/5613632.htmlDATEADD日期函数DATEADD()函数在日期中添加或减去指......
  • 无涯教程-JavaScript - TRUE函数
    描述TRUE函数返回逻辑值TRUE。YoucanusethisfunctionwhenyouwanttoreturnthevalueTRUEbasedonacondition.Example=IF(A1=1,TRUE()).YoucanalsoenterthevalueTRUEdirectlyintocellsandformulaswithoutusingthisfunction.Example=IF(A1=1,T......
  • Shell 函数
    linuxshell可以用户定义函数,然后在shell脚本中可以随便调用。shell中函数的定义格式如下:[ function ] funname [()]{    action;    [return int;]}说明:1、可以带functionfun() 定义,也可以直接fun()定义,不带任何参数。2、参数返回,可以显示加......
  • js - callback()回调函数
    1、回调函数的定义和概念回调函数是一种特殊的函数,它作为参数传递给另一个函数,并在被调用函数执行完毕后被调用。即:函数a的参数为函数b,当函数a执行完之后再去执行b作用:回调函数通常用于事件处理、异步编程和处理各种操作系统和框架的API2、代码展示functiona(callback){......
  • 第15节课:AI框架图片识别之数据解析、Network初始化、Sigmoid激活函数及Feedforward函
    第15节课:AI框架图片识别之数据解析、Network初始化、Sigmoid激活函数及Feedforward函数详细内容请关注微信公众号:从零起步学习人工智能 https://mp.weixin.qq.com/s?__biz=MzU3OTc4OTEzNw==&mid=2247483658&idx=1&sn=3d8b40ce71e84c717428d4a1994581e0&chksm=fd618934ca1600229308......
  • mysql 字段前两位替换成其他字符 mysql字符替换函数
    一、字符串处理函数1、REPLACE()字符串替换语法:REPLACE(str,old_str,new_str);含义:将str中的old_str替换为new_str字符串。注意:当搜索要替换的文本时,MySQL使用区分大小写匹配来执行要替换的字符串搜索。示例:将"helloworld!"中hello字符串替换为hi。SELECTREPLACE('hel......
  • 无涯教程-JavaScript - IF函数
    描述如果条件为TRUE,则IF函数返回一个值,如果条件为FALSE,则返回另一个值。语法IF(logical_test,value_if_true,[value_if_false])争论Argument描述Required/Optionallogical_testTheconditionyouwanttotest.Requiredvalue_if_trueThevaluethatyouwan......
  • 【转载】python 的sort()函数详解
    1.函数sort()是对列表就地排序>>>x=[8,9,0,7,4,5,1,2,3,6]>>>x.sort()>>>print(x)[0,1,2,3,4,5,6,7,8,9]2.函数sort()修改序列,不返回任何值>>>x=[8,9,0,7,4,5,1,2,3,6]>>>y=x.sort()>>>print(y)None>>>p......
  • 魔法函数
    魔法函数是Python中特殊命名的函数,用于实现特定的功能或操作。它们以双下划线开头和结尾,例如__init__和__str__。魔法函数在类中被调用,以执行与对象创建、运算符重载、属性访问等相关的操作。以下是一些常用的魔法函数及其功能:__init__(self,...):初始化方法,在创建对象时被......