似乎如果你使用的是RequireJS并使用define
和require
,那么也没有使用IIFE的意义,因为每个模块已经包含在{{1 }} / define
。是这样的吗?
换句话说,这段代码是
require
与
有任何区别/优势define(['app'], function(app)
{
app.run();
});
答案 0 :(得分:3)
一般情况下,您不需要使用带有RequireJS的IIFE,但有时候应该使用。
如果您使用通常的define([... deps ...], function (...) {...})
格式,那么您只能从全局空间读取 define
,而您执行的所有操作都会封装在您传递给{{{ 1}}。无论是否使用IIFE,您都可以泄漏想要泄漏的内容,并保持私密状态。
如果您正在编写希望能够使用和不使用RequireJS运行的代码,则通常需要IIFE。例如,这个:
define
流行的库(例如jQuery)通常具有这样的代码,允许将它们与RequireJS(或其他AMD加载器)和(function () {
'use strict';
function factory () {
// Build our module...
return something;
}
if (typeof define === 'function' && define.amd)
define([], factory); // AMD environment: call define.
else
window.Foo = factory(); // Otherwise, leak into the global space.
})();
元素一起使用。这非常普遍。使用IIFE可以使script
函数保持在全局空间之外。
答案 1 :(得分:1)
define()
函数无论如何都在全局范围内,所以在IIFE中调用它根本没有什么区别,而且它有点多余。
如果您将代码放在define
回调之外但不应该这样做会有所不同,因为每个文件应代表一个封装的模块。
我唯一能想到使用带有RequireJS的IIFE可能是在我通过在初始化之前调用require.config()
来配置我的应用程序时;但即便如此,如果我只是打电话给require.config()
并且外面没有任何代码,我仍然不会使用IIFE。
在此示例中,不需要使用IIFE:https://github.com/vasilionjea/bower-requirejs-starter/blob/master/local/js/main.js
我希望能回答你的问题。