千锋教育-做有情怀、有良心、有品质的职业教育机构

手机站
千锋教育

千锋学习站 | 随时随地免费学

千锋教育

扫一扫进入千锋手机站

领取全套视频
千锋教育

关注千锋学习站小程序
随时随地免费学习课程

当前位置:首页  >  技术干货  > 内存角度理解回调函数

内存角度理解回调函数

来源:千锋教育
发布人:wjy
时间: 2022-06-02 11:31:00 1654140660

关于回调函数对于初学者来说是个比较难以理解的知识点。本文以内存(只以堆栈)的角度来理解回调函数

变量的内存情况

在js中数据类型的划分可以分为基本类型与引用类型。两种类型在内存中的表现形式是不一样的

内存角度理解回调函数

1、基本类型

```js
//栈区创建一个变量 记录的值为10
var num = 10;
//栈区创建一个n变量 并且赋值为num变量的值
var n = num;
//将栈区n变量的值修改为20
n = 20;

console.log(num)
```

1

2、引用类型

```js
//栈区创建一个arr变量 将具体的元素值保存到堆区  并且在arr变量中的值记录为堆区的地址
var arr = [1,2];
//栈区创建一个newArray的变量 并且将 arr在栈区存储的地址赋值给newArray
var newArray = arr;
//顺着newArray记录的地址值修改数据
newArray[0] = 100;
console.log(arr);// [100,2]
```

2

函数的情况

函数也是一种引用类型,所以创建一个函数就与创建数组在内存的情况类似,当创建一个函数时,会在栈区创建一个变量,然后将函数代码相关的信息存储到堆区,最后将堆区的地址赋值给栈区的变量保存

```js
function fn(){
    console.log('fn')
}
// 创建函数 就是创建了一个函数名称的同名变量。并且值指向"堆区”的地址(声明式与赋值式一致).在堆区中会保存代码片段相关的信息
//上面的代码等价于 var fn = function(){consoel.log('fn')}
console.log(fn)

// 当函数调用时,系统可以通过"变量名称/函数名称" 找到函数代码在堆区的地址。也就是可以改写形式为“内存地址()”,()就是表示要将代码运行起来
fn()
```

3

自调用匿名函数

```js
(function(){
    console.log('123456')
})();
/*

 function(){
     console.log('123456')
 }
 就是一个函数表达式,本身就可以得到一个内存地址   例如该内存地址等于0X111 ,内存地址中存储着函数的代码信息
 所以上面的代码可以理解为(0X111)() 这种形式,这种形式与 赋值式的函数时是一直 所以最后可以调用函数
 
*/
```

回调函数

回调函数就是将函数作为作为另外一个函数调用的参数进行传递。其本质也只是传递了一个内存地址

1、函数参数传递引用类型

```js
function fn(a){
    //3、当函数调用时 会隐藏的进行 var a = arr的操作 所以将arr变量存储的地址赋值给了a变量  所以a就是一个地址  因为a变量存储的值对应的是函数所以最终时候可以通过a[下标]访问元素的
    console.log(a)
}
//1、栈区创建一个arr变量 赋值为堆区中保存数据的地址
var arr = [1,2,3]
//2、调用函数并且传递arr变量的值  传递的是一个内存地址
fn(arr)
```

2、将函数作为参数传递

```js
//1、创建一个fn变量 并且赋值为堆区中的地址
function fn(a){
    //4、执行函数时进行形参赋值 var a = callback  所以将callback变量的地址赋值给了a 由于a是一个函数 所以可以()
    a()
}
//2、创建callback 并且赋值为堆区中的地址
var callback  = function(){
    console.log('回调函数');
}
//3、调用fn函数 并且传递参数callback的地址
fn(callback)
```

4

更多关于“web前端培训”的问题,欢迎咨询千锋教育在线名师。千锋已有十余年的培训经验,课程大纲更科学更专业,有针对零基础的就业班,有针对想提升技术的提升班,高品质课程助理你实现梦想。

tags:
声明:本站稿件版权均属千锋教育所有,未经许可不得擅自转载。
10年以上业内强师集结,手把手带你蜕变精英
请您保持通讯畅通,专属学习老师24小时内将与您1V1沟通
免费领取
今日已有369人领取成功
刘同学 138****2860 刚刚成功领取
王同学 131****2015 刚刚成功领取
张同学 133****4652 刚刚成功领取
李同学 135****8607 刚刚成功领取
杨同学 132****5667 刚刚成功领取
岳同学 134****6652 刚刚成功领取
梁同学 157****2950 刚刚成功领取
刘同学 189****1015 刚刚成功领取
张同学 155****4678 刚刚成功领取
邹同学 139****2907 刚刚成功领取
董同学 138****2867 刚刚成功领取
周同学 136****3602 刚刚成功领取
相关推荐HOT