你应该在RequireJS上使用IIFE吗?

时间:2014-11-20 22:03:08

标签: javascript requirejs iife

似乎如果你使用的是RequireJS并使用definerequire,那么也没有使用IIFE的意义,因为每个模块已经包含在{{1 }} / define。是这样的吗?

换句话说,这段代码是

require

有任何区别/优势
define(['app'], function(app)
{
    app.run();
});

2 个答案:

答案 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

我希望能回答你的问题。