由forEach和map函数联想到的浏览器工作原理,闭包

本文对比了JavaScript的forEach和map方法,强调它们的共同点在于操作数组,参数一致,但forEach无返回值而map有。重点讲解了为何对象操作会直接影响原对象,涉及栈与堆的区别,以及闭包模型的应用。
摘要由CSDN通过智能技术生成

1.forEach和map的相同点:
(1):都是操作数组且只能操作数组。
(2):参数一样
(3):this都是指向window。

2.不同点:
(1)返回值:forEach没有返回值。map有。

注:若数组中是对象,修改值可直接影响原对象。
var ary = [{aa:‘oo’}];
var res = ary.map(function (item,index,input) {
return item.aa = ‘lplp’
})
console.log(res’);//–> [‘lplp’];
console.log(ary);//–>[{aa:‘lplp’}];
}
但是如果是数值,可通过数组索引来动态修改。

那么,为什么操作对象会直接影响呢。因为在forEach中操作的实际是arr对象本身。对象实际存在堆内存中,在栈中保存的是变量名和内存地址。

那为什么要设计堆和栈呢?数据是如何存储的?—>那就得说到浏览器的的工作原理了----js的内存机制
1.js是弱类型动态语言:
弱:不需要定义类型,js引擎会自己计算。
动态:不同类型的变量可以相互赋值。

2.内存空间
function foo(){
var a = “极客时间”
var b = a
var c = {name:“极客时间”}
var d = c
}
foo()

代码执行,编译—>创建执行上下文----->执行代码
当代码到第三行,a和b被保存到执行上下文中,执行上下文又被压入栈中。
但到第四行时,是个引用类型,js引擎不会直接存在栈内存中,而是先开辟一块新的内存,在堆内存中,栈中存的是堆内存的引用和变量名。所以对象复制是赋值引用,基本数据类型复制是复制整个值(开辟新的空间)

那为什么要分栈和堆呢?
因为栈主要是用来控制上下文线程的切换,如何栈过大,会影响到程序的执行效率,比如某个函数执行结束了,将指针移动到上个上下文的地址,然后该函数会被垃圾回收机制回收。
所以,栈空间不会设计太大,只用来存储一些小数据。但是堆内存设计的很大。

鉴于上面,再谈闭包模型:
function foo() {
var myName = “极客时间”
let test1 = 1
const test2 = 2
var innerBar = {
setName:function(newName){
myName = newName
},
getName:function(){
console.log(test1)
return myName
}
}
return innerBar
}
var bar = foo()
bar.setName(“极客邦”)
bar.getName()
console.log(bar.getName())

按照上面说的,执行完foo,newName和test1都会被销毁,但是foo的setName和getName都有用到foo函数的变量,js引擎认为是一个闭包,js吧test1和newName都放到closure对象中(内部对象,js无法访问)。因此foo中test2 和closure对象。
参考文章:https://blog.csdn.net/u013448372/article/details/108087346

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值