Uncaught SyntaxError: Unexpected identifier
翻译为: 未捕捉到的语法错误:始料未及的标识符
百度很多文章,大概有两种解释。
第一种说是因为本身是字符串,却没有加单引号或者双引号。我觉得如果是这种情况不应该报变量未定义的错误吗?(可能我的理解有错误,但是这个说法确实是对的。只是没有立刻能想到什么情况下是这种样子)。
第二种说是非法的标点符号。不过现在智能的编辑器,我觉得非法的话能立刻显示出来。
以下是错误图片
错误图
根据错误图片,可以看出是index.html 40行报的错。而且显示是setTimeout方法。
//我们习惯的用法是
setTimeout(function(){
// content
},2000)
// 也可以
function A(){}
//-------------从这里看出,符合第一种解释,应该是字符串的地方没有用字符串,而且用了非法的。
setTimeout('A()',2000)
// 等同于上面
setTimeout(A,2000)
// 以下是我的错误代码
function a() {
console.log(111)
return new Promise((resolve, reject) => {
setTimeout(function () {
console.log(222)
resolve('123')
}, 5000)
})
}
setTimeout(a().then(res => {
console.log(222)
console.log(res)
}),5000)
// 等同于
setTimeout(Promise.resolve(),1000)
// 也就是setTimeout的第一个参数不能是promise类型的值。只能是个字符串,或者function。修改为
setTimeout(function(){Promise.resolve()},1000)
//不要问我为啥这样写,不是我写的,我也猜不透为啥这样写,哈哈
总结:遇到这种错误,就是一定有哪里语法不太对,编辑器智能的没发现。手动查下语法问题吧!
补充说明:这个问题引发了异步的问题如下
function a() {
console.log(111)
return new Promise((resolve, reject) => {
setTimeout(function () {
console.log(333)
resolve('123')
}, 5000)
})
}
setTimeout(a().then(res => {
console.log(222)
console.log(res)
}),1000)
//猜一猜输出结果。
// 这个语法错误并没有阻止程序的继续执行。首先是一个等待1s的宏任务入队列,接着a()是立刻就执行的。所以会先输出111。
// 然后在new Promise的中,有一个等待5s的宏任务。 这个时候等待的时候,1s的宏任务执行,发现有语法错误。提示错误。
// 再然后轮到5s的任务执行,输出333。
// 再然后then中的微任务执行。输出222 和 123
输出结果为:
image.png
再看一个修改了两者时间的例子
function a() {
console.log(111)
return new Promise((resolve, reject) => {
setTimeout(function () {
console.log(333)
resolve('123')
}, 1000) // 上面为5000
})
}
setTimeout(a().then(res => {
console.log(222)
console.log(res)
}),5000) //上面为1000
// 结果则为最后输出错误
image.png
如果两个时间都是5000呢,结果也是同上的。没想到原因,感觉最外层的先放进去,应该先执行最外层的才对。也许这个本身就是个错误。想到原因再补上来。
网友评论