美文网首页
奇怪的Uncaught SyntaxError: Unexpec

奇怪的Uncaught SyntaxError: Unexpec

作者: 黎明的叶子 | 来源:发表于2021-06-06 11:29 被阅读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呢,结果也是同上的。没想到原因,感觉最外层的先放进去,应该先执行最外层的才对。也许这个本身就是个错误。想到原因再补上来。

    相关文章

      网友评论

          本文标题:奇怪的Uncaught SyntaxError: Unexpec

          本文链接:https://www.haomeiwen.com/subject/tnvzsltx.html