转载:http://www.cnblogs.com/ziyunfei/archive/2012/09/23/2698607.html
javascript中void是一个操作符,该操作符的作用是计算一个表达式但是返回undefined
void 操作符用法格式如下:
1、void expression;
2、void (expression);
expression 是一个标准的 javascript 表达式。表达式外侧的圆括号是可选的,但是写上去是一个好习惯,有时候也很有用。
> void 0 undefined > void(0) undefined > void 4+7 // 由于void比+优先级更高,所以该表达式被解析为(void 4)+7 NaN > void(4+7) undefined > var x; > x = 3; 3 > void(x = 5); undefined > x 5
void是个运算符,而不是函数,它不能被重新定义,如果自定义一个void函数,会抛出异常,像下面这样:
>function void(expr) { // 这里会报错 return undefined; } SyntaxError: Unexpected token void
javascript中其他的关键字和保留字作为函数声明的函数名时也一样会报错。
void的三种用途:
- 用void 0代替undefined
- 书签小程序
- 在链接中执行JavaScript代码
用途1: 用void 0代替undefined
用途2: 书签小程序
书签小程序(Bookmarklets)是一个能够执行JavaScript代码的URI(译者注:使用JavaScript伪协议).如果一个bookmarklet返回的结果不是undefined,那么当前页面显示的内容会被这个返回值替代.这时候就得用到void运算符.[Webkit内核的浏览器不会有这样的麻烦]:
- javascript:3+4 会把当前页面的内容替换成7.
- javascript:void(3+4) 不会改变当前页面的内容.void会“隐藏”掉表达式3+4的结果.
类似的:
- javascript:window.open("http://www.whitehouse.gov/") 会替换掉当前页面的内容.
- javascript:void window.open("http://www.whitehouse.gov/") 不会改变当前页面的内容.
更复杂的例子:这个bookmarklet可以把当前页面的URL提交到submit.example.com:
javascript:void window.open("http://submit.example.com/submit?"+encodeURIComponent(document.location.href))
这个bookmarklet不会改变当前页面的内容,会在新标签或新窗口中打开页面.
译者注:网上有很多流行的Bookmarklet,通常是导入了另外一个js文件,比如繁体字转换成简体字,比如购物网站比价.
javascript: void(document.body.appendChild(document.createElement("script")).src = "http://tongwen.openfoundry.org/NewTongWen/tools/bookmarklet_cn2.js")
用途3: 阻止超链接的默认跳转行为
<a href="javascript:void computeResult()">Compute</a>
如果函数computeResult()返回undefined(或者没有return语句,也默认返回undefined),则不会有什么事.但如果这个函数返回了其他的值,那么你必须在函数前面添加void运算符来防止它改变当前页面的内容。更常见的用法是:javascript:void(0)。
最后举几个小例子:
1、
<a href="javascript:3+7;alert('world');">单击此处什么也不会发生</a>
不管是webkit内核的浏览器还是非webkit内核的浏览器,都会首先执行3+7,结果是10;然后执行alert函数,其返回undefined,故什么也不会发生。
2、
<a href="javascript:3+7;">3+7</a>
webkit内核的浏览器执行3+7,结果是10,但是不会将当前页面替换为10;非webkit内核的浏览器执行3+7,结果是10,会将当前页面替换为10。
3、
<a href="#">单击此处返回网页顶部</a>
单击返回顶部,其实是#top(top是默认值)。