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
以上是学习的一些整理,可能有不对的地方,仅供参考