函 数 的学习

本文详细介绍了JavaScript中的函数概念,包括内置函数和自定义函数的定义与调用。讨论了匿名函数、带参数的函数以及函数的返回值。重点解析了函数的预解析机制,解释了预解析时变量与函数的处理规则,并通过实例展示了函数的嵌套使用。此外,还提到了函数在代码复用和模块化编程中的优点。
摘要由CSDN通过智能技术生成

函数的概念:

函数本身就是具备某个功能的工具。是完成某个功能的一段代码

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

自定义函数

定义语法:

function 函数名(变量){

         代码段

}

当我们定义好函数 并在页面执行时 发现并没有执行 因为函数是死的  不会自己执行 需要我们调用

函数的调用:

函数名()

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

定义函数:求两个数的和

function fn(){

var a =1

var b= 2

var c =a+b

console.log(c)

}

fn()

带参数的函数:

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

​​​​​​​function zizeng(a){  // 叫做形参 - 形式上的参数
    var b = a + 1;
    console.log(b);
}

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

zizeng(1)  实参  - 就是实际上的参数  就是给形参赋值

函数的本质:

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

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

function fn(){
    console.log(11)
}


这段代码,在内存创建了一个空间,名字叫fn,这个空间中存储的数据是函数这整段代码。

调用函数,就相当于将这段代码拿出来执行。

匿名函数:

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

var f = function fn(){
	console.log(12)
}

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

调用就是  f()

fn() 这个函数就不能调用了 

会打印出  fn is not defined

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

var f = function(){
	console.log(12)
}
f()

这样还是可以正常调用的  这个函数就是匿名函数

匿名函数 不能单独存在

function(){
    console.log(13)
}

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

(function(){
    console.log(13)
})

js提供了一个专门用来调用匿名函数的语法:

(function(){
    console.log(13)
})()

这个就就叫做自调用函数

自调用函数也可以不给函数加小括号,在函数前加感叹号或波浪线:

!function(){
    console.log(14);
}()
~function(){
    console.log(14);
}()

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

(function(a,b){
    var c = a + b;
    document.write(c);
})(1,2);

函数的优点;
1. 实现了代码的可重用性
2. 实现了模块化编程

带返回值的函数:

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

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

function add(ch,math,en){
    var sum = ch + math + en;
    return sum
}


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

function add(ch,math,en){
    var sum = ch + math + en;
    return sum
}
var a = add(20,30,40)
var avg = add(20,30,40)/3
function add(ch,math,en){
    var sum = ch + math + en;
    return sum
    console.log(sum)
}
add(20,30,40)

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

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

return总结:

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

预解析:

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

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

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

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

预解析js代码


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

开始按顺序一行一行解读代码

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

预解析分为变量的预解析和函数的预解析,也就是代码在执行之前先进行解析,将变量和函数的定义放在内存中。

但是在打印之后声名过变量的话,情况就不一样了

预解析总结:

1. 匿名函数赋值给变量的定义方式,预解析时遵循变量的预解析规则,不会将函数代码预解析

2. 预解析的时候,会将定义提前放在内存中,不会提前将赋值放在内存中

3. 如果变量名和函数名同名了,保留函数预解析,忽略变量预解析

   因为函数预解析其实包含了赋值的过程,函数定义放在内存中的时候将函数的代码也放在内存中

   变量的预解析只有空间,没有值,所以如果是先预解析变量,那后面的函数预解析赋值就将空间中放入了值,如果是先预解析的函数,再次预解析变量的时候,空间已经存在了,再次定义空间也是没有意义的。

4. 省略var定义的变量是不会有预解析的

5. js代码如果报错了,那后面的代码就不会执行了

6. 不会执行的代码中有变量或函数定义也会预解析,因为预解析在执行之前。

函数的嵌套:


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

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

function fn(){
    console.log(1)
    function fun(){
        console.log(2)
    }
    fun()
}
fn()
function fn(){
    console.log(1)
}
function fun(){
    fn()
    console.log(2)
}
fun()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值