javascript运行机制

1,javaScript中的数组和对象是一个引用类型
2,作用域链是逐级向外层查找的
3,参数相当于一个局部变量
今天主要整理这三句话的理解:
一,首先先看一个例子:

var arr = [1, 2, 3]
			function changeArr() {
				arr[3] = 4
				arr = [5]
			}
			changeArr()
			console.log(arr) // [5]

这个例子最后的结果,相信大家都没有问题,那接下来把这个例子稍微修改下:

var arr = [1, 2, 3]
			function changeArr(arr) {
				arr[3] = 4
				arr = [5]
			}
			changeArr(arr)
			console.log(arr) 

当我把arr当作参数传递的时候,那这个输出应该是什么呢?

输出的结果为: [1,2,3,4]

解释:在上边的例子中,全局变量arr作为参数传递到函数中,那么参数arr相当于是一个局部的变量,此时全局的arr和参数arr指向的是同一个数组(即引用类型的同一个内存),arr[3] = 5的时候,相当于也改变了全局的arr,所有arr此时为: [1,2,3, 4] ,所以说最后的console.log输出的arr为全局的arr,即[1,2,3,4],而函数中的arr = [5],相当于给局部的arr赋予了一个全新的数。
如果把上边的例子修改:

var arr = [1, 2, 3]
			function changeArr(jArr) {
				jArr[3] = 4
				jArr = [100]
				console.log(jArr)
			}
			changeArr(arr)
			console.log(arr) // [100]

这样的话,再结合上边的解释,可以更好的理解下,jArr即为局部的arr

二,我们在看第二个例子

setTimeout(function() {
				console.log('set1')
			})
			var p = new Promise((resolve, reject) => {
				console.log('promise1')
				setTimeout(function() {
					console.log('set2')
				})
				resolve()
			})
			p.then(function() {
				console.log('then1')
			})
			setTimeout(function() {
				console.log('set3')
			})
			console.log(123)

在看运行出答案之前我们先补充点知识:
setTimeout是宏任务,promise是微任务
javaScript执行完微任务就会执行下一个宏任务
在这里插入图片描述

例子的输出答案为:promise1,123,then1, set1, set2, set3

解释:首先js会执行主程序我们代码从上往下看会发现promise1和123这两个输出是在主线程上的,所以会先输出promise1和123这两个数,接下来因为then1是微任务所以会输出then1,执行完then1以后,会执行下一个宏任务set1,执行完set1以后会再去循环看看有没有微任务,这时候发现没有微任务了,接着执行下一个宏任务set2, 然后接着循环执行set3

我们把上面的例子稍微修改下:
在第一个setTimeout中插入一个new Promise

setTimeout(function() {
				console.log('set1')
				new Promise(function(resolve, reject) {
					resolve()
				}).then(function() {
					console.log('then2')
				})
			})
			var p = new Promise((resolve, reject) => {
				console.log('promise1')
				setTimeout(function() {
					console.log('set2')
				})
				resolve()
			})
			p.then(function() {
				console.log('then1')
			})
			setTimeout(function() {
				console.log('set3')
			})
			console.log(123)

例子的输出答案为:promise1,123,then1, set1,then2, set2, set3

解释:前边的运行过程还是跟上边的一样,只是运行完set1以后,循环的时候发现有待执行的微任务,然后会执行then2,然后接着循环执行set2,接着循环执行set3

以上是学习的一些整理,可能有不对的地方,仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值