奇怪的Uncaught SyntaxError: Unexpec

2021-06-06  本文已影响0人  黎明的叶子

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呢,结果也是同上的。没想到原因,感觉最外层的先放进去,应该先执行最外层的才对。也许这个本身就是个错误。想到原因再补上来。

上一篇下一篇

猜你喜欢

热点阅读