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