IIFE中使用void与包装的区别void function()vs(function())

Umu*_*acı 8 javascript iife

创建模块的常见做法是将它们包装在parens中,这样就不会泄漏模块外的任何变量(连接时等).

还有voidoperator,它计算给定的表达式并返回undefined.(见MDN)

我想知道在parens中使用包装函数而不是使用包装函数的原因是什么void.它是历史的,是否与连接有关?

我知道,当其中一个文件缺少分号时,你可能会遇到连接问题,直到你注意到它为止会导致令人讨厌的问题.

例子

说,module1.js(注意缺少的逗号):

(function () {
    return function () {
        console.log('module1. I should not be called');
    };
})()
Run Code Online (Sandbox Code Playgroud)

和,module2.js:

(function () {
    return function () {
        console.log('module2. I should not be called either');
    };
})();
Run Code Online (Sandbox Code Playgroud)

如果将这些脚本连成一个包,它将产生以下结果:

(function () {
    return function () {
        console.log('module1. I should not be called');
    };
})()(function () {
    return function () {
        console.log('module2. I should not be called either');
    };
})();
Run Code Online (Sandbox Code Playgroud)

由于两个模块(文件)都返回一个函数,所以第二个假定的IIFE成为第一个模块返回值的调用,有效地调用console.log.常见的解决方法是声明您的模块!(function (){})();,强制返回的值为布尔值.

但是,如果您要使用void,例如:

void function () {
    return function () {
        console.log('module1. I should not be called');
    };
}()
Run Code Online (Sandbox Code Playgroud)

连接文件仍然是错误的,但您会在第一次运行时注意到错误,因此更容易被注意到.见下文.

void function () {
    return function () {
        console.log('module1. I should not be called');
    };
}()void function () {
    return function () {
        console.log('module2. I should not be called either');
    };
});
Run Code Online (Sandbox Code Playgroud)

这引发了Unexpected token void.就模块而言,我相信!(function(){}()void function(){}()达到同样的效果.但是我觉得void看起来比用params包含一个函数并且!在它之前更加干净(主观).

我错过了什么?如果我们使用它会不会更好void

jkd*_*dev 5

好吧,许多JavaScript程序员认为这void是令人困惑和多余的,尤其是Douglas Crockford,他将其称为JavaScript 的“不良部分”之一。

在函数定义之前加上void可能会特别令人困惑。在C ++之类的语言中,它的意思是“这是一种不返回值的函数”。在JavaScript中,void不定义任何内容;相反,它对函数(或其他表达式)求值并返回value undefined。因此,您在JavaScript代码中看不到太多。

有关使用!优先模块的更多信息,请查看此StackOverflow答案

另外,请务必阅读Ben Allman关于IIFE的原始博客文章