gpt4 book ai didi

javascript - IIFE void function() vs (function()) 在括号中使用 void 与包装的区别

转载 作者:数据小太阳 更新时间:2023-10-29 04:15:50 24 4
gpt4 key购买 nike

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

还有 void 运算符,它计算给定的表达式并返回 undefined。 (参见MDN)

我想知道更喜欢在括号中包装函数而不是使用 void 的原因是什么。它是历史的,它是否与串联有关,否则?

我知道当其中一个文件缺少分号时,您可能会遇到连接问题,这会导致严重的问题,直到您注意到为止。

例子

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

(function () {
return function () {
console.log('module1. I should not be called');
};
})()

和 module2.js:

(function () {
return function () {
console.log('module2. I should not be called either');
};
})();

如果您将这些脚本合并成一个包,它会产生这样的结果:

(function () {
return function () {
console.log('module1. I should not be called');
};
})()(function () {
return function () {
console.log('module2. I should not be called either');
};
})();

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

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

void function () {
return function () {
console.log('module1. I should not be called');
};
}()

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

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');
};
});

这会抛出 Unexpected token void。就模块而言,我相信 !(function(){}()void function(){}() 达到相同的效果。但我觉得像 void 看起来比用参数包装函数并在其前面加上 ! 看起来更干净(主观)。

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

最佳答案

嗯,许多 JavaScript 程序员认为 void 令人困惑和多余,尤其是 Douglas Crockford,他称它为 "Bad Parts" 之一的JavaScript。

在函数定义之前加上 void 可能会特别困惑。在 C++ 等语言中,它的意思是“这是一种不返回值的函数”。在 JavaScript 中,void 不定义任何东西;相反,它计算函数(或其他表达式)并返回值 undefined。所以你在 JavaScript 代码中看不到它。

有关在模块之前使用 ! 的更多信息,请查看 this StackOverflow answer .

另请务必阅读 Ben Allman's original blog post on IIFE's .

关于javascript - IIFE void function() vs (function()) 在括号中使用 void 与包装的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28828348/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com