我见过一些人void
在他们的代码中使用运算符。我也在href
属性中看到了这一点:javascript:void(0)
这似乎并不比javascript:;
那么,使用void
运算符的理由是什么?
我见过一些人void
在他们的代码中使用运算符。我也在href
属性中看到了这一点:javascript:void(0)
这似乎并不比javascript:;
那么,使用void
运算符的理由是什么?
这就是书签通常将代码包装在 void() 或不返回任何内容的匿名函数中的原因,以阻止浏览器尝试显示执行书签的结果。例如:
javascript:void(window.open("dom_spy.html"))
如果您直接使用返回某些内容的代码(在本例中为新窗口实例),浏览器最终将显示:
javascript:window.open("dom_spy.html");
在 Firefox 中,上面将显示:
[object Window]
undefined
在 ES1.3 之前,无法在 JavaScript 中直接访问该值。
void <expression>
因此,包含一个运算符以允许访问此值。
它有时很有用,尤其是在使用 Web API(例如事件处理程序)时,可以确保表达式的结果一致undefined
。
当undefined
属性被添加到 ES1.3 中的全局对象时, 的效用void
变得不明显。
因此你的问题。
在 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
,像这样:var undefined = "hello"
or var undefined = 23
,并且大多数浏览器会接受它;undefined
没有Promise标识符实际上是未定义的¹。因此,要返回实际的未定义值,使用了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
。
考虑以下:
<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
,则表达式返回null
or以外的内容的那一刻undefined
,浏览器会将其解释为链接应该做什么。通过将所有表达式/语句包装在一个void()
函数中,您可以确保整个代码片段都能运行。如今,这主要用于 Bookmarklets,因为使用onclick
属性或在单独的 Javascript 块/文件中设置事件处理程序是“规范”。
至于javascript:
vs. javascript:void()
,第一个陈述是模棱两可的。你是说,“嘿,我想运行一些 javascript”,但是你没有提供任何代码。不一定清楚浏览器在这里应该做什么。使用第二个语句,您说“嘿,运行一些 javascript”,并且您的代码最终返回 undefined,浏览器知道这意味着“什么都不做”。
既然我在这里,我还要指出使用javascript:
或javascript:void();
已经失去大多数关心标记的人的青睐。更好的做法是让您的 onclick 处理程序返回 false,并将链接指向一个页面/资源,这对于关闭 javascript 或使用 javascript 阻止程序(如 NoScript)的人来说是有意义的。