创建模块的常见做法是将它们包装在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?
好吧,许多JavaScript程序员认为这void是令人困惑和多余的,尤其是Douglas Crockford,他将其称为JavaScript 的“不良部分”之一。
在函数定义之前加上void可能会特别令人困惑。在C ++之类的语言中,它的意思是“这是一种不返回值的函数”。在JavaScript中,void不定义任何内容;相反,它对函数(或其他表达式)求值并返回value undefined。因此,您在JavaScript代码中看不到太多。
有关使用!优先模块的更多信息,请查看此StackOverflow答案。
另外,请务必阅读Ben Allman关于IIFE的原始博客文章。
| 归档时间: |
|
| 查看次数: |
739 次 |
| 最近记录: |