一,函数对象与实例对象的区分
函数对象:将函数作为对象使用时,简称为函数对象
实例对象:new函数产生的对象,简称对象
正常来说,()的左边是函数,点的左边是对象。
即可以根据()或者点来判断这个函数是作为函数来使用的还是作为对象来使用的,作为函数使用,则是函数,作为对象使用,则是函数对象。而通过构造函数产生的对象,就直接判定为实例对象。
二,两种类型的回调函数
回忆下回调函数的定义:我自己定义的,我没有调用,但是最终它执行了。
1,同步回调
立即执行,完全执行完了才结束,并不会放入到回调队列中去。
例子:数组遍历相关的回调函数
const arr =[1,2,3,4,5,6,7,8]
arr.forEach(item=>{
console.log(item)
})
console.log("本宝宝心里苦啊")
也就是说,他会等这里的遍历数组结束了,才会按顺序执行后面的代码,如果遍历数组花了很长时间,程序就会一直在遍历,而不会执行后面的代码。
2,异步回调
不会立即执行,会放入到回调队列中去,等待将来执行
例子:定时器回调/ajax回调/promise成功或失败的回调
setTimeout(()=>{
console.log("这是定时器中的内容")
},1000)
console.log("宝宝心里又不苦惹~~~~")
也就是先执行正常的代码,而后执行异步操作,因为异步操作被放入队列中将来执行了。
所以,可以根据程序的先后执行来判断一些操作是同步回调,还是异步回调。
三,常见的内置错误
1,ReferenceError:引用的变量不存在
2,TypeError:数据类型不正确
3,RangeError:数值不在其允许的范围内
4,SyntaxError:语法错误
四,错误的处理(捕获与抛出)
捕获错误:try……catch
抛出错误:throw error
//把你认为有可能发生报错的代码放置在try里面,如果报错,则执行catch代码,不报错则顺序执行
//catch的参数是个对象,错误信息放置在message和stack里面
try{
let d
console.log(d.xxx)
}catch(error){
console.log(error.message)
console.log('这里也可以定义一些自定义的报错信息')
}
console.log('如果报错,这里的也会执行')
当然,也可以自定义错误:
function something(){
if(Date.now()%2===1){
console.log('当前时间为奇数,可以执行任务')
}else{
throw new Error('当前时间为偶数,无法执行任务')
}
}
//捕获异常处理
try{
something()
}catch(error){
console.log(error.message)
}
console.log('如果报错,这里的也会执行')