从Uncaught SyntaxError: Unexpected token ")" 问题看javascript:void的作用

问题

    在前端编程中,突然出现Uncaught SyntaxError: Unexpected token “)”的错误,行号1。这个错误真的很隐晦,开始还以为是其他JS文件的错误,结果发现错误原来就存在当前问件中。错误场景是这样的,使用X作为关闭窗口的按钮,代码如下:

    X 

点完关闭后,就发生了开头提到的错误。

分析

    该HTML段代码是使用JavaScript脚本动态插入到DOM树中的,当时并没有怀疑到是这个地方的问题,直到搜索相似错误时,发现有人也碰到了类似的问题。原来是标签中脚本缺少了一个0。





a标签javascript:void(0)与javascript:void()区别



    X 
 
    X 



点第1个“X”时,不报错,点第2个“X”时报错,而且错误位置为1行7列,可见,问题出在标签中的脚本上。

引申

为什么不加0就报错呢?看一下void的定义:

void 运算符

避免表达式返回值。

void expression

expression 参数是任意有效的 JScript 表达式。

void 运算符对表达式求值,并返回 undefined.在希望求表达式的值,但又不希望脚本的剩余部分看见这个结果时,该运算符最有用。

以上为void的含义,void 实际上是一个求职表达式,类似于eval,但不返回任何值。

标签中,href属性可以执行javascript,但若有返回值,则会发生页面跳转,页面显示值为javascript后数据:

   javascript:1
   javascript:'test is ok'
这个不会发生跳转,但是会弹出提示框:

   javascript:alert(2)  

当我们利用标签不是为了页面跳转,而是为了屏蔽页面跳转,那么void函数就派上用场了:

  javascript:void 0 
实际上,void不使用挎号也完全是可行的,使用括号是为了让代码编写得更规范。

void后接任何合法的javascript代码,均能达到不返回值、页面不跳转的效果,但显然 void 0 是最简洁的写法。

注意:

如果是表达式,则需要加上括号:

  javascript:void 9+19    
  
  javascript:void(9+19) 

  javascript:void eval(9+19)   
第1个返回NaN,第2、3个不返回值。

你可能感兴趣的:(JavaScript)