require_once在JavaScript中有类似的功能吗?

12
我目前正在寻找一个解决方案,以避免重复包含同一个 .js 文件。
所以我的问题比较简单,我正在寻找类似于 require_once (.php) 或 #ifndef(.c/.c++) 的东西。
它们可以解决这个问题吗?
3个回答

8

您可以编写自己的#ifndef代码,只需按照以下方式编写文件(假设是为浏览器编写的):

if (!window.NAME_UNIQUE_FOR_THIS_FILE) {
  window.NAME_UNIQUE_FOR_THIS_FILE = true;

  .. your code here ...

}

如果语句检查到该唯一命名的变量不存在,则创建它(因此下次看到该代码时,将会忽略它)。然后运行您希望此文件执行的任何操作。但请确保使用非常独特的名称,因为它是全局变量。

你的意思是我必须把这个放在我的“.js”文件的顶部吗? - Sindar
我认为他的意思是将整个JS文件包装在IF块中。这似乎只适用于使用函数表达式的情况。这在使用函数定义时不起作用(请参见http://jsfiddle.net/XbAgt/)。您需要有条件地作为整个JS文件进行包含。像其他答案中提到的库可能是最好的选择。 - Matt Molnar
XHR是正确的。我也同意,如果可以的话,为此编写一个库会是更真正的解决方案。关于函数表达式和函数定义,这只会在某些情况下成为问题(其中状态被捕获在函数中)。如果函数被相同的函数覆盖,那么它并不会真正伤害任何人。 - Jakob

8
我建议您使用 require.jshead.js 来完成这种任务。它们都是功能齐全的工具,而且还能提高性能。

0

您可以在 HTML 页面的顶部包含此文件。

include.js:

/* require.js */
if (typeof includedScripts === 'undefined')
{
    includedScripts = [];

    function isIncluded(name)
    {
        return includedScripts.includes(name);
    }

    function includeThis(name)
    {
        includedScripts.push(name);
    }
}

然后在每个后续包含的文件顶部,您可以使用以下内容进行测试和设置(例如,在此处使用scripts/ajax.js):

if (isIncluded("scripts/ajax")) exit;
includeThis("scripts/ajax");

此处使用全局数组includedScripts来跟踪包含的脚本。这是类似于非常古老的C头文件包含测试的模式:

#ifndef __myFile
#define __myFile

/* content of your file here */

#endif


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接