我见过一些人在代码中使用void
运算符。我也在href
属性中看到了这一点:javascript:void(0)
这似乎没有javascript:;
那么,使用void
运算符的理由是什么?
答案 0 :(得分:50)
Explanation of its use in links:
这就是bookmarklet的原因 经常将代码包装在void()或 没有的匿名函数 返回任何内容以停止浏览器 从试图显示结果 执行书签。对于 例如:
javascript:void(window.open("dom_spy.html"))
如果您直接使用返回的代码 某事(一个新的窗口实例) 这种情况),浏览器将结束 显示:
javascript:window.open("dom_spy.html");
在Firefox中,上面会显示:
[object Window]
答案 1 :(得分:15)
在ES1.3之前,JavaScript中无法直接访问undefined
值。
因此包含了运营商void <expression>
以允许访问此值。
它有时很有用,特别是在使用Web API(例如事件处理程序)时,确保表达式的结果始终为undefined
。
当undefined
属性被添加到ES1.3中的全局对象时,void
的实用程序变得不明显。
因此你的问题。
答案 2 :(得分:12)
请考虑以下事项:
<a href="javascript:void(fish=document.getElementById('foo').value);void(document.getElementById('bar').value=fish);">With Void</a>
<a href="javascript:fish=document.getElementById('foo').value;document.getElementById('bar').value=fish;">Without Void</a>
<input type="text" id="foo" value="one fish" />
<input type="text" id="bar" value="no fish" />
第一个链接将交换文本字段的值。第二个链接将打开一个带有“one fish”文本的新页面。如果您使用javascript: link
,表达式会返回null
或undefined
以外的其他内容,浏览器会将其解释为链接应该执行的操作。通过将所有表达式/状态包装在void()
函数中,可以确保运行整个代码片段。目前,这主要用于Bookmarklets,因为使用onclick
属性,或者在单独的Javascript块/文件中设置事件处理程序是“常态”。
对于javascript:
与javascript:void()
,第一个陈述含糊不清。你说,“嘿,我想运行一些javascript”,但是你没有提供任何代码。浏览器应该在这里做什么并不一定清楚。使用第二个语句,你会说“嘿,运行一些javascript”,你的代码最终返回undefined,浏览器知道这意味着“什么都不做”。
由于我在这里,我还要指出,使用javascript:
或javascript:void();
已经不再支持大多数关心加价的人。更好的办法是让你的onclick处理程序返回false,并将链接指向一个页面/资源,这对于关闭了javascript或使用NoScript等javascript阻止程序的人来说是有意义的。
答案 3 :(得分:3)
JavaScript void
运算符用于显式返回undefined。它是一元运算符,意味着只能使用一个操作数。您可以按如下所示使用它-独立或带有括号。
void expression;
void(expression);
让我们看一些例子
void 0; //returns undefined
void(1); //returns undefined
void 'hello'; //undefined
void {}; //undefined
void []; //undefined
void myFunction();
void(myFunction());
如果您问为什么只需要返回undefined而不是仅返回undefined
的特殊关键字:原因是在ES5之前您实际上可以命名全局变量undefined
,如下所示:{ {1}}或var undefined = "hello"
,大多数浏览器会接受;未承诺标识符var undefined = 23
实际上是不确定的¹。因此,要返回 actual 未定义的值,请使用undefined
运算符。它不是一个非常流行的运算符,并且很少使用。
让我们看一个带有void的函数示例
void
//just a normal function
function test() {
console.log('hello');
return 2;
}
//lets call it
console.log(test()); //output is hello followed by 2
//now lets try with void
console.log(void test()); //output is hello followed by undefined
丢弃该函数的返回值,并显式返回undefined。
您可以从我的教程文章中进一步了解:https://josephkhan.me/the-javascript-void-operator/
¹在ECMAScript 5和更高版本中,保证全局变量void
是未定义的(ECMA-262 5th Ed.,第15.1.1.3节),尽管仍然可以在内部作用域内使用变量。名为undefined
。