76

我见过一些人void在他们的代码中使用运算符。我也在href属性中看到了这一点:javascript:void(0)这似乎并不比javascript:;

那么,使用void运算符的理由是什么?

4

4 回答 4

61

其在链接中的使用说明

这就是小书签经常将代码包装在 void() 或不返回任何内容的匿名函数中以阻止浏览器尝试显示小书签的执行结果的原因。例如:

javascript:void(window.open("dom_spy.html"))

如果您直接使用返回某些内容的代码(在这种情况下为新窗口实例),浏览器将最终显示:

javascript:window.open("dom_spy.html");

在 Firefox 中,上面将显示:

[object Window]
于 2009-03-20T16:43:48.193 回答
30

undefined在 ES1.3 之前,该值不能在 JavaScript 中直接访问。

因此,包含一个操作员void <expression>以允许访问该值。

有时它很有用,特别是在使用 Web API(例如事件处理程序)时,可以确保表达式的结果是一致的undefined

undefined属性被添加到 ES1.3 中的全局对象时, 的效用void变得不明显。

因此你的问题。

于 2017-07-07T09:31:03.093 回答
17

在 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 而不是 return undefined:原因是在 ES5 之前你实际上可以命名一个全局变量undefined,像这样:var undefined = "hello"or var undefined = 23,大多数浏览器都会接受它;该标识符undefined并未被承诺实际上是未定义的¹。因此,要返回实际的未定义值,使用了void运算符 is/was。虽然它不是一个非常受欢迎的运算符,但很少使用。

让我们看一个带有 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

void丢弃函数的返回值并显式返回 undefined。

您可以从我的教程帖子中阅读更多内容:https ://josephkhan.me/the-javascript-void-operator/

¹ 在 ECMAScript 5 及更高版本中,全局变量undefined保证为未定义(ECMA-262 第 5 版,第 15.1.1.3 节),尽管仍然可以在内部范围内命名变量undefined

于 2019-09-19T20:48:40.527 回答
13

考虑以下:

<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" />

第一个链接将交换文本字段的值。第二个链接将打开一个带有文本“一条鱼”的新页面。如果您使用 a javascript: link,则在表达式返回nullor以外的内容的那一刻undefined,浏览器会将其解释为链接应该执行的操作。通过将所有表达式/语句包装在一个void()函数中,您可以确保您的整个代码片段将运行。如今,这主要在 Bookmarklets 中使用,因为使用onclick属性或在单独的 Javascript 块/文件中设置事件处理程序是“规范”。

至于javascript:vs. javascript:void(),第一个说法是模棱两可的。你说,“嘿,我想运行一些 javascript”,但是你没有提供任何代码。不一定清楚浏览器应该在这里做什么。对于第二个语句,您说“嘿,运行一些 javascript”,您的代码最终返回未定义,浏览器知道这意味着“什么也不做”。

既然我在这里,我还要指出,大多数关心标记的人都不再喜欢使用javascript:or 。javascript:void();更好的做法是让您的 onclick 处理程序返回 false,并让链接指向一个页面/资源,这对于关闭 javascript 或使用 javascript 拦截器(如 NoScript)的人来说是有意义的。

于 2009-03-20T16:54:37.933 回答