0

我是 JavaScript 新手,我正在尝试弄乱该语言以更好地掌握它。我似乎无法理解的一件事是开发人员如何构建大型 JavaScript 程序。我假设你会像在 Java 中那样把它分解成一堆更小的文件。显然,您不会在 JavaScript 中执行此操作。所有内容都在一个大文件中吗?这对我来说似乎不正确。

例如,我想要两个文件,一个包含我所有的辅助函数,一个包含特定问题的函数。我计划在我的问题特定文件中使用辅助函数。

如果我应该把东西放在一个大文件中,我应该将它与模块分开吗?很抱歉这么长的帖子,我很困惑,我不确定我应该如何措辞。

4

2 回答 2

2

这实际上取决于您的应用程序有多大。如果它是一次性表单处理程序,您可能会将所有逻辑放在一个文件中。但是,如果它是一个更大的单页应用程序,您将需要考虑将其分解为多个文件。文件如何相互交互取决于它们在页面中包含的顺序。例如,如果一个文件依赖于另一个文件,请确保该脚本包含在您的页面中,位于主脚本之后。

为了帮助更好地组织您的依赖项(而不是自己管理脚本包含顺序),并使您走上正轨,您可能应该看看 RequireJS: http ://requirejs.org/docs/start.html

这是第三方介绍和教程 http://javascriptplayground.com/blog/2012/07/requirejs-amd-tutorial-introduction/

至于您的模块模式问题,您可以使用模块模式,但如果一个文件中的一个模块依赖于单独文件中的另一个模块,您仍然会遇到相同的依赖问题。您可能想从 Eloquent Javascript 中查看这一章:http: //eloquentjavascript.net/chapter9.html

于 2013-10-22T17:10:19.793 回答
-1

您不需要任何花哨的 js 插件来执行此操作,只需在 html 中的主 js 文件之前包含您的“头文件”(所有函数声明)。

例子:

文件 1.js:

//declare your functions here
function handyFunction() {
 //do some handy stuff
}

文件2.js:

//use them here
handyFunction();

html:

<body>
<!-- all your html here -->
<script src="file1.js" type="text/javascript"></script>
<script src="file2.js" type="text/javascript"></script>
</body>

如果您对全局对象上的所有内容感到不自在,您可以拥有包含您需要的方法的对象,并根据需要创建它们的实例或访问先前创建的实例。只是一个简单的例子:

MyObject.js:

function MyObject() {
    this.property = "someValue";
}

MyObject.prototype.someMethod = function () {
    //do something
}

主.js:

var obj= new MyObject();
obj.someMethod();

html:

<!-- always remember to include your files in the correct order -->
<script src="MyObject.js" type="text/javascript"></script>
<script src="main.js" type="text/javascript"></script>

好的,最后一个澄清。在 JavaScript 中,每个变量都在函数范围内声明,除非没有变量,在这种情况下它会附加到窗口对象。这称为函数作用域,与其他语言有很大不同。这意味着您在文件中声明的所有内容都将 1)附加到全局对象(窗口)或 2)只能由声明它的函数访问。因此,如果您想“匿名化”某些代码,您可以围绕它包装一个自动执行的匿名函数,并且由于该函数没有引用它的变量,因此该代码之外的任何人都无法访问该代码。这就是为什么你看到(function() { /*...*/}());在很多地方。那么,如何在文件之间共享以这种方式声明的代码呢?很简单,给它一个名字!这样就创建了模块模式。在第一个文件中,您将所有代码声明在一个名为“module”的变量或任何浮动您的山羊的变量中,并在其中以您喜欢的最奇特的方式放置所有方法(例如,通过使用匿名函数并返回一个对象)。诀窍是在全局对象上声明这个“模块”对象,以便能够跨应用程序中的文件使用它。真的没有更多的东西了。

于 2013-10-22T17:13:27.270 回答